一、后期静态绑定的原理与实现:
后期静态绑定的功能,用于在继承范围内引用静态调用的类。“后期绑定”的意思是说,static:: 不再被解析为定义当前方法所在的类,而是在实际运行时计算的。
1-当实现类中2个函数功能相同时,可以写在抽象类中,抽象类不能实例化。
2-将类的定义与类的调用分离开。
3-用后期静态绑定,使用关键字static将self替换
self 始终与定义它的类绑定
static始终与调用它的类绑定
<?php abstract class A { public function write() { return new static(); } public static function amount($geshu ,$pici) { return '出席的人:'.$amount = $geshu * $pici; } public static function index($geshu,$pici) { return static::amount($geshu,$pici); } } class Base extends A { public static function amount($geshu, $pici) { return '实际出席的人有:'.$amount = $geshu * $pici *3; } } class C extends A { } echo Base::index(1000,5); //输出结果是 价格是:5000 //如果把class A中的index()方法中的self改成static,那么调用Base的index() 就与Base绑定 //最后输出的结果是 15000
运行结果:
二、构造器
1- 魔术方法:
2-语法: 类中有一些方法总是使用双下划线开头, 这就叫魔术方法
3-调用者: 由系统根据一定的条件或用户行为, 自动调用/触发, 禁止用户主动调用
4- 构造方法: __construct(), 是类的实例化过程中被自动调用, new 的时候,在类的实例化中被调用,功能就是生成一个新对象。
<?php //构造方法 class People { private $nation; private $geshu; public function __construct($nation,$geshu,$pici) { //1.生成一个新对象,类实例 //2.初始化对象 $this->nation = $nation; $this->geshu = $geshu; $this->pici = $pici; $this->write(); } public function write() { $sum = $this->geshu * $this->pici; echo "$this->nation 派出次数为$this->pici 次,每次与会人数是:$this->geshu 人,总共出席的人数是:$sum 人"; } } $product = new People('中国',200,3);
运行结果:
三、属性重载/拦截器的所有方法:
当用户访问一个不存在或无权限的属性时,拦截器会拦截下来,进行处理。
<?php // 属性拦截器:拦截类外部属性访问 // 访问属性拦截器:__get() // 设置属性拦截器:__set() // 检测属性拦截器:__isset() // 删除属性拦截器:__unset() class Abs { private $nation = 'china'; private $city = 'foshan'; //创建访问属性拦截器 public function __get($num) { $a = 'get' . ucfirst($num); // 把拦截到的数据当成参数赋值给$k // 转发访问请求 return method_exists($this,$a) ? $this->$a():''; } // 方法1 private function getNation() { return $this->nation; } // 方法2 private function getCity() { return $this->city; } //创建设置属性拦截器 public function __set($name, $value) { $method = 'set' . ucfirst($name); return method_exists($this,$method) ? $this->$method($value) : ''; } // 方法1 private function setNation($value) { $this->nation = '这个国家叫:' . $value; } // 方法2 private function setCity($value) { $this->city = '这个城市叫:' . $value; } public function __isset($name) { return $name === 'nation' ? isset($this->nation) : 'false'; // return $name === $this->nation ? isset($this->nation) : false;//检查属性是否存在,如果存在就检查这个属性,否则打印空字符串 } // 创建属性销毁拦截器 public function __unset($name) { unset($this->nation); } } $p = new Abs; echo '<hr>'; echo $p->nation; echo '<hr>'; echo $p->city; echo '<hr>'; $p->nation = 'korea'; $p->city = 'yunfo'; echo $p->nation; echo '<hr>'; echo $p->city; echo '<hr>'; var_dump(isset($p->nation)); echo '<hr>'; unset($p->nation); var_dump(isset($p->nation));
运行结果:
四、方法重载/拦截器的所有方法:
当用户调用一个不存在或者没有权限访问的方法或静态方法时,会拦截下来进行处理。
<?php // 方法拦截器 // __call(参数1 , 参数2):当工作端访问不存在或者无权限的方法时调用 // __callStatic(参数1 , 参数2):当工作端访问不存在或者无权限的‘静态’方法时调用 // 参数1:方法名称 // 参数2:传递给当前方法的参数列表 class Demo { // 方法拦截器 public function __call($name, $arguments) { printf('名: %s , 幸运数: [%s]', $name, implode(', ', $arguments)); } // 静态方法拦截器 public static function __callStatic($name, $arguments) { printf('静态名: %s , 幸运数: [%s]', $name, implode(', ', $arguments)); } } $user = new Demo(); $user->demo(1,2,3,4); echo '<br>'; Demo::Demo(6,7,8,9);
运行结果:
五、总结:其实自己对这一块不是很熟悉,只能先说暂时先碰了个面。里面的例子基本都是仿写。只要动手去写了,还是有印象。在什么场合使用这些,还是要加强多听和多练习。