我想知道static
关键字在特征中返回的是什么?看起来它被绑定到特性而不是使用它的类。例如:
trait Example
{
public static $returned;
public static function method()
{
if (!eval('\\'.get_called_class().'::$returned;')) {
static::$returned = static::doSomething();
}
return static::$returned;
}
public static function doSomething()
{
return array_merge(static::$rules, ['did', 'something']);
}
}
class Test {}
class Test1 extends Test
{
use Example;
protected static $rules = ['test1', 'rules'];
}
class Test2 extends Test
{
use Example;
protected static $rules = ['test2', 'rules'];
}
// usage
Test1::method();
// returns expected results:
// ['test1', 'rules', 'did', 'something'];
Test2::method();
// returns unexpected results:
// ['test1', 'rules', 'did', 'something'];
// should be:
// ['test2', 'rules', 'did', 'something'];
我可以在eval()
方法中使用一些讨厌的method()
:
public static function method()
{
if (!eval('\\'.get_called_class().'::$returned;')) {
static::$returned = static::doSomething();
}
return static::$returned;
}
现在它只是将它与\My\Namespaced\Class::$returned
匹配,但它也很奇怪,就像检查静态属性$returned
一样,该属性在特征中定义并且正确绑定到使用的类它。那为什么static::$returned
不起作用?
PHP版本是5.6.10。
答案 0 :(得分:0)
那么为什么你在这里使用后期静态绑定?
试试这个
trait Example
{
public static $returned;
public static function method()
{
if (!self::$returned) {
self::$returned = self::doSomething();
}
return self::$returned;
}
public static function doSomething()
{
return array_merge(self::$rules, ['did', 'something']);
}
}