Символическая ссылка на класс

Baton

Новичок
Символическая ссылка на класс

Код на php5

PHP:
class SomeClass{
   
   static $someVar = 'TEST';

   public function __construct(){
   }
   
}

$className = 'SomeClass';

echo $className::$someVar; //не работает
Как работать с символическими ссылками на класс?

Если нет такой возможности, то как вызывать методы или статические свойства класса по символической ссылке? Может есть какая-нибудь функция?
 

Baton

Новичок
Имя класса заранее неизвестно.

В данных классах есть статические свойства.

ЗЫ: А в чём проблема?
 

Gremboloid

инженера Гр...
Начиная с версии PHP 5.3.0 существует возможность ссылаться на класс используя переменную.
 

Baton

Новичок
Автор оригинала: zerkms
Baton
в 5.3 будет
пока - юзай call_user_func_array
А что мне это даст, если внутри call-функции всё равно придётся вызывать класс по ссылке?

Или вы хотите сказать, что надо писать call-обвёртку для каждого класса? Типа:

PHP:
function callSomeClass(){
   return SomeClass::$someVar;
}

echo call_user_func( 'call'.$className );
А проще никак? Например одну функцию обвёртку для всех классов?
 

zerkms

TDD infected
Команда форума
call_user_func_array(array('classname', 'methodname'), $params)
call_user_func_array(array($object, 'methodname'), $params)
 

whirlwind

TDD infected, paranoid
zerkms что с тобой? ты чему человека учишь?

Baton тебе не имя класса нужно, а экземпляр. LSB - это не комильфо!
 

zerkms

TDD infected
Команда форума
whirlwind
ой да ладно...
$object = new $class();
$object->$method();

более комильфо что ли?
 

Baton

Новичок
Автор оригинала: zerkms
call_user_func_array(array('classname', 'methodname'), $params)
call_user_func_array(array($object, 'methodname'), $params)
2zerkms, имеется в виду, что в каждом классе надо создать метод getSomeVar ?

PHP:
class SomeClass{
   
   static $someVar = 'TEST';

   public function __construct(){
   }
   
   static function getSomeVar(){
      return self::$someVar;
   }

}

$className = 'SomeClass';

echo call_user_func_array( array( $className, 'getSomeVar'), array() );
-~{}~ 15.04.09 17:43:

Друзья, я постарался написать очень простой пример в первом посте.

Да и вообще ситуация крайне простая! Если знаете, то пожалуйста, напишите готовый пример. А если не можете (не хотите или другие причины), то не пишите! Я уже устал отгадывать загадки.

Спасибо за понимание!

-~{}~ 15.04.09 17:48:

2whirlwind, вы предлагаете свойства классов перевести в свойства экземпляров, то бишь отказаться от static ?

Проблема в том, что не я решаю :)
 

zerkms

TDD infected
Команда форума
а, ёмаё, это доступ к статическим свойствам.... ошибся, пардон.
 

whirlwind

TDD infected, paranoid
2whirlwind, вы предлагаете свойства классов перевести в свойства экземпляров, то бишь отказаться от static ?

Проблема в том, что не я решаю :)
да, именно это. я уверен что потом вы только спасибо скажете.
 

dimagolov

Новичок
Baton, у тебя не просто статик. У тебя статик в классе, имя которого тебе неизвестно. И кроме всего прочего, ты пытаешься напрямую добраться до него снаружи. То есть полное презрение к инкапскуляции. Тот код, что пытается это сделать должен знать все о кишках класса, который ему подсовывает неизвестно кто и который непонятно что должен делать.
 

whirlwind

TDD infected, paranoid
Baton

Аргумент один: статик убивает трех китов - полиморфизм, инкапсуляцию, наследование. Статик - это не ооп. Если это не ооп, то все оопешные причиндалы это мишура, которая запутывает код. Если это запутывает, то это никому не нужно. Ик.. дзееен.
 

флоппик

promotor fidei
Команда форума
Партнер клуба
статик - это эмуляция неймспейса, не более того. В правильном ооп его нету.
 

john.brown

просто кулибин
PHP:
function callSomeClass(){ 
   return SomeClass::$someVar; 
} 

echo call_user_func( 'call'.$className );
А проще никак? Например одну функцию обвёртку для всех классов?
PHP:
class SomeClass {
	static $var = 'Static variable';
}
function getStaticVar($class, $var) {
	return eval('return '.$class.'::$'.$var.';');
}
echo getStaticVar('SomeClass', 'var');
Но это очень не комильфо...
 

fixxxer

К.О.
Партнер клуба
Автор оригинала: whirlwind
Baton

Аргумент один: статик убивает трех китов - полиморфизм, инкапсуляцию, наследование. Статик - это не ооп. Если это не ооп, то все оопешные причиндалы это мишура, которая запутывает код. Если это запутывает, то это никому не нужно. Ик.. дзееен.
[оффтоп]
А как ты без статиков реализуешь управление зависимостями? Для меня этот момент самый сложный в архитектуре фреймворков. Как только пытаешься отойти от передачи всего и вся через параметры конструкторов (или сеттеры), начинаются всяческого рода global state-ы. Можно заменить Registry на таскаемый везде и всюду $Context/$Toolkit/как угодно, но сильно лучше от этого не становится, только еще больше запутывает связи и мешает разделению обязанностей между классами. IoC как-то не вдохновил, по крайней мере без человеческого reflection подобие nanocontainer не получится, а Spring-подобный конфиг зависимостей это как то стремно совсем, у нас же не Java, это дело каждый раз парсить, да и разрастется оно до такого неприличия что черт ногу сломит.
 
Сверху