Вызов метода класса через строковую переменную

netstuff

Новичок
Вызов метода класса через строковую переменную

получаю имя класса, как строковую переменную:

PHP:
$object = $class_name;
далее необходимо вызвать метод method() этого класса:

если
PHP:
$object->method();
, то получаю ошибку:
Fatal error: Call to a member function render() on a non-object
если же
PHP:
call_user_func(array($object, 'method'));
, то получаю
Fatal error: Using $this when not in object context
(в методе пытаюсь получить public-перемнную класса)

теперь сам вопрос:
как из строковой переменной получить прямую ссылку на экземпляр класса?

спасибо :rolleyes:
 

HraKK

Мудак
Команда форума
Тебе надо это
PHP:
$object = $class_name;
$obj = new $object();
$ob->method();
Либо если обьект уже обьявлен то:
PHP:
$object = $class_name;
$$object->method()

Когда это string содержал указатель? Никак
 

netstuff

Новичок
Автор оригинала: HraKK
Либо если обьект уже обьявлен то:
PHP:
$object = $class_name;
$$object->method()
Когда это string содержал указатель? Никак
объект уже объявлен.
$$object - не помогло
Fatal error: Call to a member function render() on a non-object in
насчет того, что string не содержит указатель - понимаю. вот и хочу натравить строку на экземпляр =)
 

HraKK

Мудак
Команда форума
должно помочь

выведи print $class_name
и print $$class_name

-~{}~ 20.11.06 14:33:

$render = new render();
$class_name='render';
$$calss_name->renderSome();// $'render'->renderSome()
 

netstuff

Новичок
Автор оригинала: HraKK
должно помочь

выведи print $class_name
и print $$class_name
спасибо, что не забываешь =)
итак,

PHP:
$object = strtolower($result);
print "1: ".$object."<br>";
print "2: ".$$object."<br>";
выводит:

"html" - имя как раз того самого экземпляра ($html = new Html())
 

HraKK

Мудак
Команда форума
Что у тебя выведет этот код?
PHP:
<?php	
class html{
	function ht()
	{
		print 'html';
	}
}
$html= new html();
$string='html';
$$string->ht();
?>
 

hermit_refined

Отшельник
netstuff
ничего не понятно.
приведите самодостаточный кусок кода, из которого бы стало понятно, что вы хотите.
потому что, если воспринимать фразу
получаю имя класса, как строковую переменную
дословно - то никак. разве что это Singleton или метод - статический.
 

zarus

Хитрожопый макак
Была тема уже такая. Там несколько вариантов давали. Singleton и Factory
 

netstuff

Новичок
Автор оригинала: hermit_refined
netstuff
ничего не понятно.
приведите самодостаточный кусок кода, из которого бы стало понятно, что вы хотите.
потому что, если воспринимать фразудословно - то никак. разве что это Singleton или метод - статический.
с радостью обрисую ситуевину.
у системы модульная структура.
есть класс Modulator(), который говорит в каком месте какой модуль показывать. данные он берет из базы. фактически, он смотрит в базу и говорит какому модулю появиться на экране.

теперь код:

PHP:
function callRender($menu_id) {
  global $db;
            
  $result = $db->selectUnique("SELECT modulator.name FROM modulator LEFT JOIN menu ON menu.module = modulator.id WHERE menu.id ".$menu_id);
  if($result) {
    $object = strtolower($result);
    $object->render($menu_id);
  }
}
код не работает. затык именно с $object.

вот =(
 

zarus

Хитрожопый макак
Советую перечитать предыдущие посты, и сделать так, как там было написано.
 

netstuff

Новичок
Автор оригинала: HraKK
Что у тебя выведет этот код?
PHP:
<?php	
class html{
	function ht()
	{
		print 'html';
	}
}
$html= new html();
$string='html';
$$string->ht();
?>
чертовски странно =/
выводит то, что надо.
видимо, надо проверить очередность инициализации классов, возможно я пытаюсь вызвать неициализированный метод...
 

HraKK

Мудак
Команда форума
Ох ты горе мое.
Что это такое???

$object->render($menu_id);
$$object->render($menu_id);
-~{}~ 20.11.06 18:28:

Да черт!

Иди читай про область видимости переменных.
Откуда там возьмется модуль?
Почитай про Registry design pattern.
Пока не прочитаешь не возвращайся
 

netstuff

Новичок
Автор оригинала: HraKK
Иди читай про область видимости переменных.
Откуда там возьмется модуль?
Почитай про Registry design pattern.
Пока не прочитаешь не возвращайся
носом ткни =:D
 

netstuff

Новичок
Автор оригинала: HraKK
ну уж нет.
Google и 1 мин твоего времени.
и зачем так кричать было? :D :D :D

PHP:
$object = strtolower($result);
global $$object;
$$object->render($menu_id);
кстати, всё же, кратенько, что означает "Registry design pattern" =)

-~{}~ 20.11.06 19:01:

HraKK

спасибо ОГРОМНОЕ, добрый человек!
 

HraKK

Мудак
Команда форума
набираешь
Registry design pattern
и 1 ссылка в гуглу.

Но это не важно. Это просто упрощает жизнь от global $$object. за место этого будешь писать registry::getClass($className);
 

demon_mhm

Новичок
Ребят, извините, что влезаю, а подскажите, как быть если экземпляр класса не создаётся?
Тоесть:
PHP:
$class_name = 'some_class';
$class_name::some_method();
не прокатывает, как быть?
 

HraKK

Мудак
Команда форума
прочитать этот топик еще раз. Ты делаешь туже ошибку что и netstuff. Он кстате ее нашел и написал об этом
 

demon_mhm

Новичок
Автор оригинала: HraKK
прочитать этот топик еще раз. Ты делаешь туже ошибку что и netstuff. Он кстате ее нашел и написал об этом
Не сходится что-то. Если в рассматриваемом случае переменная должна содержать указатель на экземпляр, то что должно быть в моём случае? Не судите строго, но я считал, что это как раз должна быть строка с именем класса... В общем, не понял ничего.

-~{}~ 29.11.06 11:26:

В общем, покопался на php.net, нашел решение, делается так:
PHP:
ob_start();
    echo eval("return $class_name::class_func()");
$data = ob_get_clean();
Больше решений не нашел, может кто еще как делал, потому как от eval(), ессно, несколько коробит и понятия не имею как быть если функция будет возвращать что-то отличное от строки. массив, например или, не дай Бог, объект...
И всё равно не понимаю всех выкрикиваний умных слов типа: "Registry design pattern" и пр... Вроде бы обратился с реальным вопросом, а вокруг опять все пытаются носом по столу повозить и объяснить какой ты идиот, хорошо еще мсье Фанат не заглянул :)
 
Сверху