trait中的static :: $ property返回绑定到trait而不是class的数据

时间:2015-07-25 18:42:28

标签: php static static-members traits late-static-binding

我想知道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。

1 个答案:

答案 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']);
    }
}