Свойство static :: $ в признаке возвращает данные, привязанные к признаку вместо класса

Мне было интересно, что 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

Решение

так почему вы используете позднюю статическую привязку здесь?

попробуй это

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]