Php static::$trait中的属性返回绑定到trait而不是类的数据

Php static::$trait中的属性返回绑定到trait而不是类的数据,php,static,static-members,traits,late-static-binding,Php,Static,Static Members,Traits,Late Static Binding,我想知道static关键字在trait中返回了什么?它似乎与特质有关,而不是与使用它的类有关。例如: trait Example { public static $returned; public static function method() { if (!eval('\\'.get_called_class().'::$returned;')) { static::$returned = static::doSomethin

我想知道
static
关键字在trait中返回了什么?它似乎与特质有关,而不是与使用它的类有关。例如:

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'];
我可以在
method()
方法中使用一些讨厌的
eval()

public static function method()
{
    if (!eval('\\'.get_called_class().'::$returned;')) {
        static::$returned = static::doSomething();
    }   

    return static::$returned;
}
现在它只是将它与
\My\Namespaced\Class::$returned
进行匹配,但它也很奇怪,因为它检查一个静态属性
$returned
,该属性在trait中定义,并正确绑定到使用它的类。那么为什么
静态::$returned
不起作用


PHP版本是5.6.10。

那么为什么在这里使用后期静态绑定呢

试试这个

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

那么为什么在这里使用后期静态绑定呢

试试这个

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

有一个例子证实了你的发现。你还想知道什么?@LightnessRacesinOrbit在哪里?我已经通读了这篇文章,但找不到它。按Ctrl+F并键入“static”…函数定义中缺少
function
关键字。@pinkalvansia这是个错误,真正的代码有
function
关键字。谢谢你指出这一点。其中有一个例子证实了你的发现。你还想知道什么?@LightnessRacesinOrbit在哪里?我已经通读了这篇文章,但找不到它。按Ctrl+F并键入“static”…函数定义中缺少
function
关键字。@pinkalvansia这是个错误,真正的代码有
function
关键字。谢谢你指出这一点。因为在我的真实代码中,使用这些特性的类正在扩展另一个类,那又怎样?然后给我们看你真正的代码。你贴的例子应该有用fine@M0rtiis你是对的。我已经更新了问题中的代码。我想知道为什么我会得到这个意想不到的结果。再检查一次。主题。继承和收到的结果顺便说一下。只有在测试中使用trait而不是在Test1和test2上使用trait时,后期静态绑定才有意义,因为在我的实际代码中,使用trait的类正在扩展另一个类,所以呢?然后给我们看你真正的代码。你贴的例子应该有用fine@M0rtiis你是对的。我已经更新了问题中的代码。我想知道为什么我会得到这个意想不到的结果。再检查一次。主题。继承和收到的结果顺便说一下。只有在测试中使用trait而不是在测试1和测试2中使用trait时,后期静态绑定才有意义