依赖注入
PHP依赖注入时,在方法定义参数注入类型时,可以用接口作为提示,也可用抽象类作为提示
对象序列化
class aaa
{
function a(){
echo "string";
}
}
$aa = new aaa();
echo serialize($aa); // 序列化对象
$c = unserialize('O:3:"aaa":0:{}'); // 对序列化后的字符串进行反序列化
$c->a();
如上,如果,直接将序列化的字符串进行反序列化那么,如果能找到aaa这个类(或根据命名空间能找到),则可以序列化成功,并可调用方法
不论是成员变量,还是成员属性,在反序列化的时候,都要确保能找到该类,这样才能把对象反序列化出来。
Trait如何和类、父类合作
接口定义了一个方法,实现接口的类必须实现该方法,如果使用trait,则可以不用在类中实现,在trait中实现就好了。
trait中如果使用一些外部的类,则需要在Trait中use,在使用trait的类上use是没用的。
当一个类,继承了一个父类,又use了一个trait,优先级:
- 先取本类
- 再取本类use的trait
- 再取父类
- 以此往上类推
当一个类,use了两个trait,如果两个trait存在同名成员(方法、变量),会报错(同级)
如果不同级,则会按照继承的形式往下走,即以本类为主。
PHP中的Trait成员冲突解决办法
laravel使用中我们可能需要对User model使用softdelete这个功能,以便删除后还可以恢复,不幸的是entrust模块也有这个方法,两者产生冲突,
解决办法:
class User extends Model implements AuthenticatableInterface
{
use Authenticatable;
use EntrustUserTrait { restore as private restoreA; }
use SoftDeletes { restore as private restoreB; }
/**
* 解决 EntrustUserTrait 和 SoftDeletes 冲突
*/
public function restore()
{
$this->restoreA();
$this->restoreB();
}
}
网友评论