Получить статичную переменную класа

surg30n

Новичок
Получить статичную переменную класа

Может туплю, но всеже

PHP:
class base_c  {

   function  __construct() {
     // получить статичную переменную из класса abc
     $cl_name = get_class($this);
     @eval("\$tmp = $cl_name::\$a;");
     print_r($tmp);
  }

}

class abc extends base_c {
 
  static $a = 'value';

}

$a = new abc();
Можно ли получить по-человечески значение статической переменной?
 

Bakti9rov

!*|=?
self:: $property

если в классе присутствуют статические методы, то они не могут иметь доступ к нестатическим свойствам - т.к. это требует создания экземпляра класса. Поэтому если статический метод обращается к свойству через $this->property, это вызовет ошибку.

В данном случае использование конструктора + статические методы/свойства класса - вещи несовместимые. :)
 

surg30n

Новичок
обращение через self
вернет значение переменной класса base_c
а мне нужно значение для класса abc!
 

surg30n

Новичок
litvinenko
thx, второй пример все прояснил

Bakti9rov
проверь сам, какой там parent..
 

Beavis

Banned
а вот это
@eval("\$tmp = $cl_name::\$a;");
нельзя записать как
$tmp = $cl_name::$a; ???
 

Bakti9rov

!*|=?
Тогда что мешает сделать вот так:

PHP:
<?

class Parent
{
	protected static $property;
	
	static function getProperty()
	{
		return self::$property;
	}
}

class Child extends Parent
{}

$property = Child::getProperty();
 

Zetruger

ivan.chistyakov.name
Bakti9rov
mishco
читайте внимательнее
protected $property;
должен лежать в
class Child extends Parent
 
[del] Ааа, наконец-то понял :). ИМХО красивых стандартных решений такое сотворить не существует. Это вам не C++ ;).
Разве что $property будет public :D.
И вообще что за дизайн, parent class должен знать о protected свойствах child'а :confused:?
 

surg30n

Новичок
Почему же,
я вверху отписал, что по ссылке тов. litvinenko есть
вполне подходящий вариант, без особых извратов

PHP:
If you need a workaround for a static property overloading problem (see previous post) try this:
<?php
abstract class a {
    public static $lala = '1';
    function __construct () {
        # echo self::$lala
        $vars = get_class_vars(get_class($this));
        echo $vars['lala'];
    }
}
class b extends a {
     public static $lala = '2';
}

new b();
?>
problem solved..
 
surg30n
Читай внимательно, дружок. Описывается проблема с protected свойством. С пабликом я и давал решение, которе позже [de] :)...
 

Bakti9rov

!*|=?
Проблемы не вижу. Дочерний класс унаследует `protected $property` и метод, с ним работающий (`getProperty()`). surg30n нужно было, чтобы в классе обязательно присутствовал конструктор, и решение с php.net вполне подходит (выбор - право автора темы, не спорю), иначе бы все решалось проще и "по человечески", через статические методы.
 

WP

^_^
surg30n
Это плохое решение.

Вот рациональное:
PHP:
class a {
    function __construct () {
     echo call_user_func(array(get_class($this),'getSelfStatic'),'lala');
    }
}
class b extends a {
     public static $lala = 'test';
     function getSelfStatic($a) {return self::$$a;}
}

new b();
з.ы. и не важно public, protected или private.
 
Bakti9rov
дочерний класс не унаследует protected $property, потому что оно объявлено В НЕМ.
Код:
class abc extends base_c {
 
  static $a = 'value';

}
Если все еще не видишь проблемы, попробуй применить решение. Тогда ты все поймешь. get_class_vars получает _ТОЛЬКО_ public переменные, потому к protected свойствам ему никак не добраться.
 
Сверху