学习目标
- 命名空间
- PDO对象常用方法
- PDOStatement对象常用方法
- PDO错误处理方式
- SQL语句预处理
静态延时绑定
1、什么是静态延时绑定
- 自 PHP 5.3.0 起,PHP增加了一个叫做后期静态绑定的功能,用于在继承范围内引用静态调用的类。
- "后期绑定"的意思是说,static::不再被解析为定义当前方法所在的类,而是在实际运行时计算的。也可以称之为"静态绑定",因为它可以用于(但不限于)静态方法的调用。
- 我们需要一个在调用执行时才确定当前类的一个特征,就是说将static关键字对某个类的绑定推迟到调用执行时,就叫静态延迟绑定!
- 语法:static::静态属性,静态方法,成员方法,类常量
2、实例:静态延时绑定演示
如果只有一个类,self和static都代表当前类:
<?php
// 定义一个类
class Student
{
// 定义一个常量
const TITLE = '这是一个学生类';
// 创建一个类的方法
public function demo_fun()
{
echo self::TITLE . "<br>"; // 这是一个学生类
echo static::TITLE . "<br>"; // 这是一个学生类
echo Student::TITLE . "<br>"; // 这是一个学生类
}
}
$stu_01 = new Student();
$stu_01->demo_fun();
如果在继承范围,self永远代码当前类,static代表最终执行的类
<?php
// 定义一个类
class Student
{
// 定义一个常量
const TITLE = '这是一个学生类';
// 创建一个类的方法
public function demo_fun()
{
echo self::TITLE . "<br>"; // 这是一个学生类
echo static::TITLE . "<br>"; // 这是一个学生类
echo Student::TITLE . "<br>"; // 这是一个学生类
}
}
// 定义一个学生子类
class GroupStu extends Student
{
// 在类中声明一个常量
const TITLE = '这是学生子类';
// 创建一个类的方法
public function demo_fun()
{
echo self::TITLE . "<br>"; // 这是学生子类
echo static::TITLE . "<br>"; // 这是学生子类
echo Student::TITLE . "<br>"; // 这是一个学生类
echo GroupStu::TITLE . "<br>"; // 这是一个学生子类
}
}
$stu_01 = new Student();
$stu_01->demo_fun();
$stu_02 = new GroupStu();
$stu_02->demo_fun();
命名空间概述
思考一个问题:如何建立两个同名文件?对于所有操作系统而言,都不能在一个文件夹内建立两个同名文件,解决的办法就是创建两个不同的文件夹,然后将文件放进去。
1、什么是命名空间
- 从广义上来说,命名空间是一种封装事物的方法。
- 在很多地方都可以见到这种抽象概念。例如,在操作系统中目录用来将相关文件分组,对于目录中的文件来说,它就扮演了命名空间的角色。
- 在PHP中,命名空间用来解决在编写类库或应用程序时名称冲突的问题。
- PHP 命名空间提供了一种将相关的类、函数和常量组合到一起的途径。
2、定义命名空间的要求
- PHP 在 5.3.0 以后的版本开始支持命名空间。
- 空间中可以包含任意合法的PHP代码,但只有三种代码受命名空间的影响,它们是:类,函数和常量。
- 命名空间通过关键字namespace来声明。
- 命名空间必须是程序脚本的第一条语句。
<?php
echo "OK";
namespace App;
/**
* Fatal error: Namespace declaration statement has to be the very first statement or after any declare call in the script in C:\phpstudy_pro\WWW\a.com\demo.php on line 4
*/
3、实例:定义单个命名空间
namespace.php
文件:
<?php
// 定义一个子命名空间
namespace App\demo\test;
// (1)定义一个类
class Student
{
// 定义一个常量
const TITLE = '这是一个学生类';
// 创建一个构造方法
public function __construct()
{
echo self::TITLE . "<br>"; // 这是一个学生类
}
}
// (2)定义一个函数
function fun_demo()
{
echo "我是个函数.<br>";
}
// (3)定义一个局部常量
const NUM = 1;
// (4)其他代码
$str = "哈哈哈";
// echo "hahaha..."; 命名空间前不能有输出代码,只能有定义代码
namespace App\demo;
// $stu_02 = new test\Student();
$stu_02 = new \App\demo\test\Student();
demo.php
文件:
<?php
// 引入带有命名空间的php文件
use App\Student;
include_once('./namespace.php');
// 调用文件中的类
$stu_01 = new App\Student(); // 哈哈哈这是一个学生类
// 调用文件中的函数
App\fun_demo(); // 我是个函数.
// 调用文件中的局部常量
echo App\NUM."<br>"; // 1
// 调用文件中的普通代码
echo $str; // 哈哈哈
4、实例:定义子命名空间
- 使用“\”斜线来分割子文件夹。例如:home\controller\a.txt
- 使用“\”斜线来分割子命名空间。例如:$obj = new Home\Controller\Student()
namespace.php
文件:
<?php
// 定义一个子命名空间
namespace App\dmeo\test;
// (1)定义一个类
class Student
{
// 定义一个常量
const TITLE = '这是一个学生类';
// 创建一个构造方法
public function __construct()
{
echo self::TITLE . "<br>"; // 这是一个学生类
}
}
// (2)定义一个函数
function fun_demo()
{
echo "我是个函数.<br>";
}
// (3)定义一个局部常量
const NUM = 1;
// (4)其他代码
$str = "哈哈哈";
demo.php
文件:
<?php
// 引入带有命名空间的php文件
use App\dmeo\test\Student;
include_once('./namespace.php');
// 调用文件中的类
$stu_01 = new App\dmeo\test\Student(); // 哈哈哈这是一个学生类
// 调用文件中的函数
App\dmeo\test\fun_demo(); // 我是个函数.
// 调用文件中的局部常量
echo App\dmeo\test\NUM."<br>"; // 1
// 调用文件中的普通代码
echo $str; // 哈哈哈
使用命名空间
1、文件系统中访问文件的方式
- 相对文件名形式,如foo.txt。它会被解析为 curdir/foo.txt。
- 相对路径名形式,如subdir/foo.txt。它会被解析为 curdir/subdir/foo.txt。
- 绝对路径名形式,如/main/foo.txt。它会被解析为/main/foo.txt。
2、访问命名空间中元素的方式
- 非限定名称(不带任何前缀)。$obj = new User(),解析为$obj = new current\User()
- 限定名称(带相对空间前缀)。$obj = new Home\User(),解析为$obj = new current\Home\User()
- 完全限定名称(从根空间开始)。$obj = new \Home\User(),解析为$obj = new \Home\User()
namespace关键字
关键字namespace
可用来显式访问当前命名空间或子命名空间中的元素。它等价于类中的self
操作符。
<?php
// 定义一个子命名空间
namespace App\demo\test;
// (1)定义一个类
class Student
{
// 定义一个常量
const TITLE = '这是一个学生类';
// 创建一个构造方法
public function __construct()
{
echo self::TITLE . "<br>"; // 这是一个学生类
}
}
$stu_01= new namespace\Student(); // 这是一个学生类
$stu_01= new \App\demo\test\Student(); // 这是一个学生类
命名空间元素的导入和别名
1、描述
- 允许通过别名引用或导入外部的完全限定名称,是命名空间的一个重要特征。
- PHP命名空间支持两种使用别名或导入方式:为类名称使用别名,或为命名空间名称使用别名。
- 在PHP中,导入是通过操作符
use
来实现的,别名是通过操作符as
来实现的。
2、实例:导入命名空间中的类并起别名
<?php
// 引入带有命名空间的php文件
include_once('./namespace.php');
use App\demo\test\Student; // 当当前页面没有与引入页面重名类、函数的时候可以直接引用
// 调用文件中的类
$stu_01 = new Student(); // 哈哈哈这是一个学生类
当类名与导入文件有冲突时,使用as
起一个别名:
<?php
// 引入带有命名空间的php文件
include_once('./namespace.php');
// (1)定义一个类
class Student
{
// 定义一个常量
const TITLE = '这是一个学生类';
// 创建一个构造方法
public function __construct()
{
echo self::TITLE . "<br>"; // 这是一个学生类
}
}
use App\demo\test\Student as StudentDemo;;
// 调用文件中的类
$stu_01 = new StudentDemo(); // 哈哈哈这是一个学生类