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

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

作者: 陈钢镚学财 | 来源:发表于2018-01-13 13:17 被阅读0次

    依赖注入

    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的使用心得

          本文链接:https://www.haomeiwen.com/subject/qrkcoxtx.html