批改状态:合格
老师批语:重载 就是重定向, 别想太难了
static 不应该是用来定义静态变量方法和属性的么?学习完了后期静态绑定,可以说了刷新了我的钛合金的火眼金睛,原来 static 还可以这样子用!static:: 不再被解析为定义当前方法所在的类,而是在实际运行时计算的。也可以称之为“静态绑定”,因为它可以用于(但不限于)静态方法的调用。使用
self::或者__CLASS__对当前类的静态引用,取决于定义当前方法所在的类:
在这里static相当于self,parent一样的关键字,用来调用方法,不过与self不同,static调用的类并不一定是静态属性和静态方法,这点上看更接近于parent这个关键字的用法。
<?phpclass A {public static function who() {echo __CLASS__;}public static function test() {static::who(); // 后期静态绑定从这里开始}}class B extends A {public static function who() {echo __CLASS__;}}B::test();
属性重载:如果使用一个不存在的(无权访问)属性,就会去自动调用类中预先定义好的某个方法以处理数据;
取值:\$v1 = 对象->属性;
赋值:对象->属性 = XX 值;
判断是否存在:isset(对象->属性;)
销毁:unset(对象->属性;)
以上四种方法称之为魔术方法,
__GET(),_SET(),isset(),unset()
<?phpclass Person{public $name;public $sex;private $age; //年龄私有化,类外不能直接访问这个属性function __construct($name='', $sex='', $age){$this->name = $name;$this->sex = $sex;$this->age = $age;}private function __get($propertyName){ //这里要用private修饰,防止类外部调用if($propertyName == 'age'){return $this->age;}}}$p = new Person('朱老师', '男',43);$v1 = $p->name;$v2 = $p->sex;$v3 = $p->age; //自动调用了__get()方法获取私有属性age(函数定义里面返回)echo "name=$v1, sex=$v2, age=$v3";?>
也就是说,拦截器实质上就是拦截报错,优先处理这些未定义或者不存在或者无法访问的属性`
当对一个对象不存在的实例方法进行“调用”时,会自动调用类中的__call()这个魔术方法;
当对一个类不存在的静态方法进行“调用”时,会自动调用类中的__callstatic()这个魔术方法。
<?phpclass A{//当对这个类的对象不存在的实例方法进行调用时,会自动调用本方法//这个方法必须带2个形参://$methodName:表示要调用的不存在的方法名;//$argument:表示要调用该不存在的方法时,所使用的实参数据,是一个数组。function __call($methodName, $argument){//echo "__call被调用了!";echo $methodName . "()方法不存在!";}}$a = new A();$a->f1(); //不存在的方法,但经过处理?>
当对一个类不存在的静态方法进行“调用”时,会自动调用类中的__callstatic()这个魔术方法。和上面的处理类似。
在 laravel 的源码,还依稀记得很多static 关键字的用法,static 不应该是用来定义静态变量方法和属性的么?学习完这节课的知识发现有点任督二脉被打通的感觉了。
PHP 中的”重载”与其它绝大多数面向对象语言不同,只是他们都是用的相同的名词而已。传统的”重载”是用于提供多个同名的 类方法,但各方法的参数类型和个数不同。 PHP 所提供的”重载”(overloading)是指动态地”创建”类属性和方法。当调用当前环境下未定义或不可见的类属性或方法时,重载方法会被调用。是通过魔术方法(magic methods)来实现的。通俗一点来说,重载在 php 中的含义是指,当一个对象或类使用其未定义或不可见的属性和方法时,其中的一些“处理机制”。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号