статические переменные должны быть частью определения класса, поэтому вы не можете создавать их динамически .Даже с Reflection :
chuck at manchuck dot com 2 years ago
Важно отметить, что вызов ReflectionClass::setStaticPropertyValue
не позволит вам добавить новые статические свойства в класс.
Но это очень похоже на проблему XY .Возможно, вы на самом деле не хотите добавлять статические свойства в класс PHP во время выполнения ;у вас есть некоторый вариант использования, который может быть выполнен также таким образом.Или этот способ был бы самым быстрым, если бы он был доступен, для выполнения некоторого варианта использования.Вполне возможно, есть и другие способы.
На самом деле приведенные ниже варианты использования еще раз являются возможными решениями некоторых проблем более высокого уровня.Возможно, стоило бы пересмотреть проблему высокого уровня и переосмыслить / переосмыслить ее в различных терминах, возможно, пропустив необходимость вмешательства в статические свойства.
Я хочу словарь свойств внутри моего класса.
trait HasDictionary {
private static $keyValueDictionary = [ ];
public static function propget($name) {
if (!array_key_exists($name, static::$keyValueDictionary) {
return null;
}
return static::$keyValueDictionary[$name];
}
public static function propset($name, $value) {
if (array_key_exists($name, static::$keyValueDictionary) {
$prev = static::$keyValueDictionary[$name];
} else {
$prev = null;
}
static::$keyValueDictionary[$name] = $value;
return $prev;
}
}
class MyClass
{
use Traits\HasDictionary;
...$a = self::propget('something');
self::propset('something', 'some value');
}
Я хочу связать некоторые значения с классом, или: Я хочу словарь свойств внутри чужого класса.
Это на самом деле произошло со мной, и я нашелэтот вопрос при исследовании способов сделать это.Мне нужно было увидеть, в точке B моего рабочего процесса, в какой точке («A») был определен данный класс и какой другой частью кода.В конце концов я сохранил эту информацию в массиве, загружаемом моим автозагрузчиком, и в итоге смог сохранить debug_backtrace()
в момент первой загрузки класса.
// Solution: store values somewhere else that you control.
class ClassPropertySingletonMap {
use Traits\HasDictionary; // same as before
public static function setClassProp($className, $prop, $value) {
return self::propset("{$className}::{$prop}", $value);
}
public static function getClassProp($className, $prop) {
return self::propget("{$className}::{$prop}");
}
}
// Instead of
// $a = SomeClass::$someName;
// SomeClass::$someName = $b;
// we'll use
// $a = ClassPropertySingletonMap::getClassProp('SomeClass','someName');
// ClassPropertySingletonMap::setClassProp('SomeClass','someName', $b);
Я хочу изменить, а несоздать существующее свойство класса.
// Use Reflection. The property is assumed private, for were it public
// you could do it as Class::$property = $whatever;
function setPrivateStaticProperty($class, $property, $value) {
$reflector = new \ReflectionClass($class);
$reflector->getProperty($property)->setAccessible(true);
$reflector->setStaticPropertyValue($property, $value);
$reflector->getProperty($property)->setAccessible(false);
}