[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Строка, как название класса для создания экземпляр
AlmazDelDiablo
Извини, за заковыристое название темы. Суть такова. Имеется название класса в строке $this->act. И необходимо создать экземпляр класса, используя именно эту переменную, а не вписывая название класса в код явно.

Проще будет, если показать код:
$this->act = 'Registration';

require_once MODS_DIR . $this->act .'.class.php';
$this->act::instance();

Такой способ, конечно же, не работает, ибо таким обрадом мы обращаемся к статической переменной класса, который должен быть записан в член нынешнего класса. Вот вопрос. Что сделать с этой $this->act, чтобы использовать ее для обращения к классу? Чтобы в результате получилось: Registration::instance(); ?



Спустя 4 минуты, 43 секунды (19.10.2011 - 17:07) Winston написал(а):
Вроде все правильно, а ошибки выдает какие ?

Спустя 34 секунды (19.10.2011 - 17:07) AlmazDelDiablo написал(а):
Parse error: syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM на строку, где у меня $this->act::instance();

Спустя 3 минуты, 57 секунд (19.10.2011 - 17:11) Winston написал(а):
А так ?
$act = $this->act;
$act::instance();

Спустя 1 минута, 48 секунд (19.10.2011 - 17:13) AlmazDelDiablo написал(а):
Та же ошибка.

Спустя 9 минут, 5 секунд (19.10.2011 - 17:22) alex12060 написал(а):
AlmazDelDiablo

Расскажи нам об области видимости этой переменной act?

Спустя 3 минуты, 53 секунды (19.10.2011 - 17:26) AlmazDelDiablo написал(а):
Вот:
class Engine {
private $act;

private function switcher() {
$this->act = 'Registration';

require_once MODS_DIR . $this->act .'.class.php';
$this->act::instance( $this->init );
}
}

Спустя 4 минуты, 30 секунд (19.10.2011 - 17:30) alex12060 написал(а):
class test {

private $act;

public function a() {
$this->act = 'a';
$c = $this->act;

$c::test();
}

}


class a {
public static function test() {
echo 'lol';
}
}


$my = new test;

$my->a();


тут же все работает. У тебя должно работать как сказал тебе Winston.

Спустя 34 секунды (19.10.2011 - 17:31) ZSH написал(а):
если мне не изменяет память то:
Цитата
$act = $this->act;
$act::instance();

для версии PHP 5.3.*, а по другому никак.

P.S. То есть нельзя использовать переменную в имени класса при вызове статического метода.

Спустя 5 минут, 14 секунд (19.10.2011 - 17:36) Winston написал(а):
ZSH
Верно.

Спустя 1 минута, 9 секунд (19.10.2011 - 17:37) alex12060 написал(а):
А вообще, вот:

DavMe 01-Oct-2010 07:03
When you have a class name in a variable and want to create a new instance of that class, you can simply use:
<?php
$className = "ClassName";
$instance = new $className();
?>


If, however, you have a class that is part of a singleton pattern where you cannot create it with new and need to use:
<?php
$instance = ClassName::GetInstance();
?>


...you quickly discover that it fails miserably with a variable.
Fail Example:
<?php
$className = "ClassName";
$instance = $className::GetInstance();
?>


After a few days of head pounding, I finally put together this workaround:
<?php
$className = "ClassName";
eval('$instance = '.$className.'::GetInstance();');
?>


I hope this saves you some effort and if anyone knows of a non-eval method to accomplish this, please share!

Thanks!

Спустя 8 минут, 25 секунд (19.10.2011 - 17:46) AlmazDelDiablo написал(а):
Вот так заработало:
eval( $this->act .'::instance( $this->init );' );

Спасибо большое, ребят :).

Спустя 5 минут, 18 секунд (19.10.2011 - 17:51) ZSH написал(а):
Цитата
P.S. То есть нельзя использовать переменную в имени класса при вызове статического метода.

только статического метода!!!
$a = 'Class';
$b = new $a;

Так можно.

Спустя 3 минуты, 48 секунд (19.10.2011 - 17:55) AlmazDelDiablo написал(а):
Цитата (ZSH @ 19.10.2011 - 19:51)
Цитата
P.S. То есть нельзя использовать переменную в имени класса при вызове статического метода.

только статического метода!!!
$a = 'Class';
$b = new $a;

Так можно.

Да-да, уже проверял такое ). С не статическим все работает.

Спустя 3 часа, 8 минут, 13 секунд (19.10.2011 - 21:03) Гость_Greg1978 написал(а):
Да статика ниже версии 5.3 не работает. Сам хотел использовать когда то такое biggrin.gif


_____________
Блог | VK | GitHub | Twitch
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.