后期静态绑定
<?php
// 后期静态绑定: 又叫延迟静态绑定
// 后期静态绑定工作在: 静态继承上下文的环境中
class Pro
{
public static function ds()
{
return __CLASS__;
// 关键字:atatic,
// 定义在调用该方法时与调用类进行绑定
static::ds();
}
}
class Pro1 extends Pro
{
}
// 客户端
$a = new pro;
var_dump($a);
echo '<hr>';
$b = new pro1;
var_dump($b);
echo '<hr>';
构造方法
// 构造方法: __construct(), 是类的实例化过程中被自动调用, new 的时候,也叫构造器
// 功能就是生成一个新对象
// 构造器:__construct()
class A
{
public $dis = 12;
public $dos = 55;
public function lii()
{
echo __CLASS__;
}
public function __construct($dis,$dos) //通过在构造函数括号内定义属性,传给构造方法
{
// 初始化新对象,添加属性并赋值
$this->dis = $dis;
$this->dos = $dos;
// 自动执行操作
$this->lii();
}
}
// $c = new A(33,66);
$c = new A(33,66);
echo $c->dis; //33
echo $c->dos; //66
属性拦截器
// 属性拦截器:拦截类外部属性访问
// 访问属性拦截器:__get()
// 设置属性拦截器:__set()
// 检测属性拦截器:__isset()
// 删除属性拦截器:__unset()
// 使用场景: 当用户访问一个不存在的或无权限访问属性/方法时, 自动调用
class Abs
{
private $bus = '公交车';
private $car = '比亚迪';
//创建访问属性拦截器
public function __get($num)
{
// 先事先约定一些方法专用于处理属性访问
$k = 'get' . ucfirst($num); // 把拦截到的数据当成参数赋值给$k
// 转发访问请求
return method_exists($this,$k) ? $this->$k():'';//检查函数是否存在,如果存在就执行这个函数,否则打印空字符串
}
// 方法1
private function getBus()
{
return $this->bus;
}
// 方法2
private function getCar()
{
return $this->car;
}
//创建设置属性拦截器
public function __set($name, $value)
{
// 先事先约定一些方法专用于处理属性访问
$method = 'set' . ucfirst($name); // 把拦截到的数据当成参数赋值给$k
// 转发访问请求
return method_exists($this,$method) ? $this->$method($value) : '';//检查函数是否存在,如果存在就执行这个函数,否则打印空字符串
}
// 方法1
private function setBus($value)
{
$this->bus = '中国的' . $value;
}
// 方法2
private function setCar($value)
{
$this->car = '中国的' . $value;
}
//创建检测属性拦截器
public function __isset($name)
{
return $name === 'bus' ? isset($this->bus) : 'false';
// return $name === $this->bus ? isset($this->bus) : false;//检查属性是否存在,如果存在就检查这个属性,否则打印空字符串
}
// 创建属性销毁拦截器
public function __unset($name)
{
unset($this->bus);
}
}
$p = new Abs;
echo '<hr>';
echo $p->bus;
echo '<hr>';
echo $p->car;
echo '<hr>';
$p->bus = '奇瑞';
$p->car = '长安';
echo $p->bus;
echo '<hr>';
echo $p->car;
echo '<hr>';
var_dump(isset($p->bus));
echo '<hr>';
unset($p->bus);
var_dump(isset($p->bus));
方法拦截器
/ 方法拦截器
// __call(参数1 , 参数2):当工作端访问不存在或者无权限的方法时调用
// __callStatic(参数1 , 参数2):当工作端访问不存在或者无权限的‘静态’方法时调用
// 参数1:方法名称
// 参数2:传递给当前方法的参数列表
public function __call($name , $v)
{
return __CLASS__ . implode('- ', $v);
}
// 静态方法拦截器
public static function __callStatic($name , $v)
{
return __CLASS__ . implode('- ', $v);
}
}
echo '<hr>';
echo $p->kkkk(5,6,4);
echo '<hr>';
echo Abs::kkkk(6,7,8,9);
总结
- 1.后期静态绑定可以把定义的静态方法与调用它的类进行绑定,而不是定义它的类
- 2.只有从类外部访问这个属性时,拦截器才会工作
- 3.拦截器原理:当我们在工作端进行访问类成员时,激活拦截器,拦截器获取数据进行判断,然后通过转发访问请求转发数据到相应的函数操作后输出。