学习目标

  • 命名空间
  • 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(); // 哈哈哈这是一个学生类