Доступ к статической переменной осуществляется с помощью $ var :: $ reference - PullRequest
28 голосов
/ 24 марта 2009

Я пытаюсь получить доступ к статической переменной внутри класса, используя имя класса переменной. Я знаю, что для доступа к функции в классе вы используете call_user_func():

class foo {
    function bar() { echo 'hi'; }
} 
$class = 'foo';
call_user_func(array($class, 'bar')); // prints hi

Однако это не работает при попытке доступа к статической переменной в классе:

class foo {
    public static $bar = 'hi';
} 
$class = "foo";
call_user_func(array($class, 'bar')); // nothing
echo $foo::$bar; // invalid

Как мне узнать эту переменную? Это вообще возможно? У меня плохое предчувствие, что это доступно только в PHP 5.3, и я использую PHP 5.2.6.

Ответы [ 4 ]

30 голосов
/ 29 февраля 2012

Я думаю, что есть намного лучший (более элегантный) способ, чем создание экземпляра ReflectionClass. Я также отредактировал этот код (и мой ответ) после нескольких комментариев. Я добавил пример для защищенных переменных (вы, конечно, не можете получить к ним доступ из-за пределов класса, поэтому я сделал статический метод получения и также вызвал его, используя шаблон переменных). Вы можете использовать его несколькими способами:

class Demo
{
    public static $foo = 42;
    protected static $boo = 43;
    public static function getProtected($name) {
        return self::$$name;
    }
}

$var1 = 'foo';
$var2 = 'boo';
$class = 'Demo';
$func = 'getProtected';
var_dump(Demo::$$var1);
var_dump($class::$foo);
var_dump($class::$$var1);
//var_dump(Demo::$$var2); // Fatal error: Cannot access protected property Demo::$boo
var_dump(Demo::getProtected($var2));
var_dump($class::getProtected($var2));
var_dump($class::$func($var2));

Документация здесь:

http://php.net/manual/en/language.variables.variable.php

26 голосов
/ 24 марта 2009

Вы можете использовать отражение , чтобы сделать это. Создайте ReflectionClass объект с указанным именем класса, а затем используйте метод getStaticPropertyValue для получения значения статической переменной.

class Demo
{
    public static $foo = 42;
}

$class = new ReflectionClass('Demo');
$value=$class->getStaticPropertyValue('foo');
var_dump($value);
21 голосов
/ 24 марта 2009

Для вызова статических членов вы можете использовать такой код:

call_user_func("MyClass::my_static_method");
// or
call_user_func(array("MyClass", "my_static_method"));

К сожалению, единственный способ получить статические члены от объекта - это get_class_vars():

$vars = get_class_vars("MyClass");
$vars['my_static_attribute'];
2 голосов
/ 06 апреля 2013

Вы пробовали это?

class foo {
    static public $bar = "Hi";

    static public function bar() {
        echo "Hi";
    }
}

echo foo::$bar; // Output: Hi
foo::bar(); // Output: Hi

$class = "foo";
echo $class::$bar; // Output: Hi
$class::bar(); // Output: Hi
call_user_func($class, 'bar'); // Output: Hi
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...