PHP trait覆盖变量


PHP Traits overwrite variable

假设我有这个特质:

trait MyTrait{
    protected static $_statVar = 'defaultStaticVal';
    protected $_var = 'defaultVal';
}

和一个使用它的类

class MyClass{
    use MyTrait;
}

如何修改默认值,比如

use MyTrait{
    MyTrait::$_statVar = 'nonDefaultStaticVal';
    MyTrait->_var = 'nonDefaultVal';
}

我知道所显示的语法是不正确的,而且目前,不允许仅通过更改它们来更改继承的trait值。这给我留下了什么选择/选择?

PHP扩展class &性状启动控制

我创建了一个小助手来解决大多数情况,并扩展了你在类+ trait启动过程中的执行优先级。以下示例中使用的数字取决于设置的顺序。类似于Laravel的启动机制。

辅助类:

class TraitHelper
{
    // The helper will call the boot function on every used trait.
    static public function bootUsedTraits($obj)
    {
        $usedTraits = class_uses($obj);
        foreach ($usedTraits as $traitClass) {
        $path = explode('''', $traitClass);
        $traitBootMethod = array_pop($path);
        $traitBootMethod = 'boot'.$traitBootMethod;
        if (method_exists($obj, $traitBootMethod)) {
            $obj->$traitBootMethod();
            }
        }
    }
}
你们班

:

class MyClass{
    use MyTrait;
    // Class default values
    static protected $a = 1;
    protected $b = 2;
    function __construct()
    {
        // Class setting values before trait
        self::$a = 4;
        $this->b = 5;
        $this->traitVar = 6;

        // Trait setting values
        'TraitHelper::bootUsedTraits($this);

        // Class setting values after trait
        self::$a = 10;
        $this->b = 11;
        $this->traitVar = 12;
    }
}

你的特质:

trait MyTrait {
    // Trait default values
    protected $traitVar = 3;
    // Called on "bootUsedTraits"
    public function bootMyTrait() {
        self::$a = 7;
        $this->b = 8;
        $this->traitVar = 9;
    }
}