Как объявить переменную публичной переменной в классе - PullRequest
1 голос
/ 23 марта 2011

Эй, у меня есть такой класс

class derp{

public $$ini;

public static function regIni($ini){

derp::$$ini = 'test';

}

}

А потом в другом файле у меня есть

core::regIni('register');

А потом где-то еще я использую

core::$register;

Это приводит к ошибке

public $$ini 

неверный код, но если я оставлю его без, я не смогу установить

core::$$ini

Как это исправить?

Обратите вниманиечто $$ ini - это переменная переменная, означающая, что значение $ ini фактически является именем переменной, поэтому $ ini = 'registry', а затем $$ ini фактически означает $ registry.

Ответы [ 4 ]

3 голосов
/ 23 марта 2011

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

class derp {

    protected static $_data = array(); 

    public static function regIni($ini, $value) {
         derp::$_data[$ini] = $value;   
    }

    public static function getIni($ini, $default = NULL) {
        return isset(derp::$_data[$ini]) ? derp::$_data[$ini] : $default;
    }
}
1 голос
/ 23 марта 2011

Итак, это не слишком полезный ответ, так как я могу просто заключить, что в настоящее время это невозможно.

  • Вы не можете, например, определить new ReflectionProperty("derp", "static_prop") и присоединить его.Это действительно только для самоанализа.
  • $c = new ReflectionClass("derp"); и $derp->setStaticPropertyValue("p", 123); тоже не работает.Свойства должны быть предварительно определены.
  • И, наконец, ни одна из них runkit_* функции не может помочь с этой задачей.Они предназначены главным образом для изменения методов.
  • То же самое для classkit .

Я не знаю других подобных расширений PECL, но это не будетполезно как общее решение в любом случае.Поэтому для текущих версий PHP вы не можете добавить статические свойства класса после этапа анализа.

0 голосов
/ 23 марта 2011

Марио сказал:

Это невозможно.Статические свойства могут быть определены только на этапе анализа.Ни ReflectionProperty или ReflectionClass :: setStaticPropertyValue, ни функции runkit_ * в настоящее время не способны (предназначены) для создания свойств статического класса.Извините

Geuss Я согласен на работу вокруг.Сделал массив $ ini и загрузил туда значения derp: $ ini ['base'] ['key']

Спасибо за помощь,

Робин

0 голосов
/ 23 марта 2011

взгляните на магические методы __set и __get

...