PHP特征覆盖变量

问题描述 投票:3回答:1

假设我有这个特性。

trait MyTrait{

    protected static $_statVar = 'defaultStaticVal';
    protected $_var = 'defaultVal';

}

和一个使用它的类

class MyClass{

    use MyTrait;

}

我如何去改变默认值,如

use MyTrait{

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

}

我知道所显示的语法是不正确的,而且目前不允许简单地通过改变继承的特性值来改变它们。这让我有什么选择呢?

php default-value traits class-variables
1个回答
0
投票

PHP 扩展类 & trait booting control

我创建了一个小助手,可以解决大多数情况,并在类+特质的启动过程中扩展你的执行优先级。下面的例子中使用的数字是尊重设置顺序的. 类似于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:

trait MyTrait {

    // Trait default values
    protected $traitVar = 3;

    // Called on "bootUsedTraits"
    public function bootMyTrait() {
        self::$a = 7;
        $this->b = 8;

        $this->traitVar = 9;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.