12,关于PHP依赖注入、对象序列化、Trait的使用心得

依赖注入

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();
    }
}

本文出自半醒的狐狸博客

你可能感兴趣的:(12,关于PHP依赖注入、对象序列化、Trait的使用心得)