【问题标题】:PHP Traits overwrite variablePHP Traits 覆盖变量
【发布时间】:2013-02-22 22:59:11
【问题描述】:

假设我有这个特质:

trait MyTrait{

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

}

还有一个使用它的类

class MyClass{

    use MyTrait;

}

我将如何更改默认值,例如

use MyTrait{

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

}

我知道显示的语法不正确,而且目前不允许简单地通过更改继承的特征值来更改它们。这给我留下了哪些选择/替代方案?

【问题讨论】:

  • 有什么特殊原因不能只更改类的构造函数中的值或使用 setter 方法?
  • 构造函数在 trait 中并且是私有的。我目前正在考虑使用setter方法。
  • 单身特征?也许看看这里 -> stackoverflow.com/questions/7104957/… 及其使用 init 方法来处理任何额外的构造函数配置
  • 不错。但我的重点更多在于设置特征中的默认变量值,但为使用这些特征的某些类更改这些默认值。
  • 那么我认为您需要重新考虑在特征内部提供变量,而是使用抽象类,它本身使用特征,但在其外部声明变量。后期静态绑定可以处理具有不同静态值的派生类

标签: php default-value traits class-variables


【解决方案1】:

PHP 扩展类和特征启动控制

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

【讨论】:

    猜你喜欢
    • 2020-11-26
    • 1970-01-01
    • 2012-07-25
    • 2012-02-24
    • 1970-01-01
    • 2018-09-27
    • 2017-02-25
    • 2021-08-24
    • 2020-09-30
    相关资源
    最近更新 更多