服务端 - PHP - OOP之延迟静态绑定、构造方法和重载
一、延迟静态绑定
- 解释:将类实例的创建过程上移到它的基类中
- 语法:static::类成员
- 特点:由调用者决定绑定的静态继承上下文环境
- 作用:将类的定义和类的调用分离
- 场景:动态绑定静态成员的调用上下文
//定义一个基类
class A {
public static $name = '小明';
public static function sayName() {
return '我的名字叫'.static::$name;
}
}
//定义一个扩展类
class B extends A {
public static $name = '小红';
}
//客户端代码
echo B::sayName();//调用B类继承自A类的sayName方法,绑定的是B类的环境
二、构造方法
- 定义:__construct()
- 调用:在类的实例化过程中被自动调用
- 特征:1. 生成一个新对象/类实例;2. 初始化这个新对象:给这个新对象添加属性并赋值,或自动执行某些操作方法;3. 返回这个刚刚创建并初始化的对象
- 场景:在实例化的时候,使用构造方法自动完成类属性的初始化/赋值
//定义一个工作类
class SetPersonInfo {
function __construct($name, $sex, $age)
{
$this->name = $name;
$this->sex = $sex;
$this->age = $age;
}
}
//客户端代码
$p1 = new SetPersonInfo('小明', '男', 18);
echo $p1->name;
echo $p1->sex;
echo $p1->age;
echo '<br>';
$p1 = new SetPersonInfo('小红', '女', 17);
echo $p1->name;
echo $p1->sex;
echo $p1->age;
三、重载
1. 属性拦截器
//定义一个工作类
class Person {
//定义一个私有属性:用于演示属性查询和检测拦截器
private $name;
//定义一个私有属性:用于演示属性设置和销毁拦截器
private $age;
//初始化$name属性
public function __construct($name)
{
$this->name = $name;
}
//设置属性查询拦截转发器
public function __get($property)
{
//事先约定一些方法用于处理属性访问
$method = 'get' . ucfirst($property);
//转发访问请求
return method_exists($this, $method) ? $this->$method() : null;
}
//处理属性访问的方法1
public function getName() {
return mb_substr($this->name, 0);
}
//处理属性访问的方法2
public function getAge() {
return $this->age;
}
//设置属性设置拦截转发器
public function __set($property, $value)
{
//事先约定一些方法用于处理属性设置
$method = 'set' . ucfirst($property);
//转发访问请求
return method_exists($this, $method) ? $this->$method($value) : null;
}
//处理属性设置的方法
public function setAge($value) {
$this->age = $value;
}
//设置属性检测拦截转发器
public function __isset($property)
{
//返回检测结果
return $property === 'name' ? isset($this->name) : false;
}
//设置属性销毁拦截转发器
public function __unset($property)
{
//进行销毁处理
if ($property === 'age') {
unset($this->age);
}
}
}
//客户端代码
$p1 = new Person('小明');//定义一个对象
echo $p1->name; //访问私有属性触发查询拦截转发器
$p1->age = 18; //设置私有属性触发设置拦截转发器
echo $p1->age; //访问私有属性触发查询拦截转发器
echo isset($p1->name) ? '存在' : '不存在';//检测私有属性触发检测拦截器
unset($p1->age); //删除私有属性触发删除拦截器
echo $p1->age; //访问私有属性触发查询拦截转发器,发现没有值返回
2. 方法拦截器
//定义一个工作类
class Person {
//定义普通方法拦截器
public function __call($name, $arguments)
{
printf('方法名: %s , 参数: [%s]', $name, implode(', ', $arguments));
}
//定义静态方法拦截器
public static function __callStatic($name, $arguments)
{
printf('静态方法名: %s , 参数: [%s]', $name, implode(', ', $arguments));
}
}
//客户端代码
$p1 = new Person();
$p1->getName('小明', '小红', '小王', '小倩');
echo '<br>';
Person::getName('小明', '小红', '小王', '小倩');
四、课程总结
- 今天学习了 PHP 的面向对象编程,通过上课认真听讲和认真完成老师布置的作业,使得我对 PHP 面向对象编程的理解和运用更加深入和熟悉。最主要的知识点是明白和掌握了延迟静态绑定、构造函数和拦截器的特点以及它们的基本用法。