1、后期静态绑定
- 静态调用的方法:self::,parent::,static::
代码示例
<?php
//后期静态绑定
class User{
public static function getName(){
return $name = "李明";
}
public static function back(){
//return self::getName();
return static::getName();
}
}
class User1 extends User{
public static function getName(){
//return parent::getName();
return $name = "小虎";
}
}
//客户端
echo User1::getName();
echo"<hr>";
echo User::getName();
?>
2、属性重载/拦截器的方法
- 拦截器方法:“拦截”发送到未定义方法和属性的消息
拦截器方法
方法 | 描述 |
---|---|
__get($property) | 访问未定义的属性时被调用 |
__set($property,$value) | 给未定义的属性赋值时被调用 |
__isset($property) | 对未定义的属性调用isset()时被调用 |
__unset($property) | 对未定义的属性调用unset()时被调用 |
__call($method,$arg_array) | 调用未定义的方法时被调用 |
代码示例
<?php
class User
{
private $name;
private $age;
public function __construct($name, $age)
{
$this->name = $name;
$this->age = $age;
}
// 1. 属性查询拦截器
public function __get($property)
{
$method = 'get' . ucfirst($property);
// 2. 转发访问请求
return method_exists($this, $method) ? $this->$method() : null;
}
private function getName()
{
return $this->name . '-->';
}
private function getage()
{
return $this->age;
}
// 2. 属性设置拦截器
public function __set($property, $value)
{
$method = 'set' . ucfirst($property);
// 转发访问请求
return method_exists($this, $method) ? $this->$method($value) : null;
}
private function setName($value)
{
$this->name = trim($value);
}
private function setage($value)
{
if($value===null) unset($this->age) ;
else $this->age = ('保密');
}
// 3. 属性检测拦截器
public function __isset($property)
{
return $property === 'name' ? isset($this->name) : false;
}
// 4. 属性销毁拦截器
public function __unset($property)
{
if ($property === 'age') {
$method = 'set' . ucfirst($property);
// 转发访问请求
if (method_exists($this, $method)) return $this->$method(null) ;
}
}
}
// 客户端
$user = new User('李明', 23);
// 访问了一个无访问权限的类属性
echo $user->name;
echo $user->age;
echo '<hr>';
$user->name = '小花';
$user->age = '34';
echo $user->name;
echo $user->age;
unset($user->name);
echo $user->name;
unset($user->age);
echo $user->age;
?>
?>
3、方法重载/拦截器的方法
代码示例
<?php
class User
{
// 方法拦截器
public function __call($name, $arguments)
{
printf('方法名: %s , 参数: [%s]', __FUNCTION__ , implode(', ', $arguments));
}
// 静态方法拦截器
public static function __callStatic($name, $arguments)
{
printf('静态方法名: %s , 参数: [%s]', __FUNCTION__ , implode(', ', $arguments));
}
}
$user = new User();
$user->name('方法拦截器');
echo '<br>';
User::name('静态方法拦截器');
?>
学习总结
本节课我们学习了后期静态绑定、重载与拦截,对学过的知识似懂非懂的感觉,看知识点、视频感觉会了,但是脱离视频自己写示例太费劲,通过后期的学习来学懂这部分知识点。