假设我有这个特性:
trait MyTrait{
protected static $_statVar = 'defaultStaticVal';
protected $_var = 'defaultVal';
}
使用它的课程
class MyClass{
use MyTrait;
}
我如何更改默认值,例如
use MyTrait{
MyTrait::$_statVar = 'nonDefaultStaticVal';
MyTrait->_var = 'nonDefaultVal';
}
我知道显示的语法不正确,而且目前不允许仅仅通过更改它们来更改继承的特征值。这让我有什么选择/选择?
答案 0 :(得分:0)
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;
}
}