一、后期静态绑定的原理与实现:
后期静态绑定的功能,用于在继承范围内引用静态调用的类。“后期绑定”的意思是说,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 '
';
echo $p->nation;
echo '
';
echo $p->city;
echo '
';
$p->nation = 'korea';
$p->city = 'yunfo';
echo $p->nation;
echo '
';
echo $p->city;
echo '
';
var_dump(isset($p->nation));
echo '
';
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 '
';
Demo::Demo(6,7,8,9);
运行结果:
五、总结:其实自己对这一块不是很熟悉,只能先说暂时先碰了个面。里面的例子基本都是仿写。只要动手去写了,还是有印象。在什么场合使用这些,还是要加强多听和多练习。