|
Странное наследование
|
| bambr |
Опубликовано 21-07-2010 20:21
|

Пользователь
Сообщений: 171
Зарегистрирован: 09.03.08
|
PHP <?php -
echo "Script start<br>"; -
class Singleton { protected static $m_Instance; public static function Instance() { if( !isset( $m_Instance ) ) { $name = static::__CLASS__; $m_Instance = new $name; echo "Singleton construct<br>"; } return $m_Instance; } } -
-
class A extends Singleton { private function __construct() { echo "A construct<br>"; } public function foo() { echo "A::Foo called!<br>"; } } -
class B extends Singleton { private function __construct() { echo "B construct<br>"; } public function foo() { echo "B::Foo called!<br>"; } } -
A::Instance()->foo(); B::Instance()->foo(); ?> -
Не выводит ничего. Даже текст "Script start". Включение отображения всех ошибок ничего не меняет. По-прежнему пусто. В чем прикол?
PHP Version 5.3.2-1ubuntu4.2
Не бойся прыгнуть в пустоту |
| |
|
|
| bambr |
Опубликовано 21-07-2010 21:48
|

Пользователь
Сообщений: 171
Зарегистрирован: 09.03.08
|
Порывшись нашел такую реализацию: [url]http://habrahabr.ru/blogs/php/85852/[/url]
Добавил костыль-псевдоконструктор, получилось такое:
PHP <?php abstract class Singleton { // Экзепляры создаваемых классов private static $m_Instance = array(); // Закрываем конструктор protected function __construct() {} // Закрываем клонирование final private function __clone() {} -
// Собственно получение экземпляра public static function Instance() { $class_name = get_called_class(); if( !isset( self::$m_Instance[ $class_name ] ) ) self::$m_Instance[ $class_name ] = new $class_name; -
self::$m_Instance[ $class_name ]->Init(); return self::$m_Instance[ $class_name ]; } // Заменитель конструктора public function Init() { echo "Singleton Init<br>"; } } -
-
class A extends Singleton { public function foo() { echo "A::Foo called!<br>"; } public function Init() { echo "Init A<br>"; } } -
class B extends Singleton { public function foo() { echo "B::Foo called!<br>"; } } -
A::Instance()->foo(); B::Instance()->foo(); ?>
Конечно было бы приятнее иметь просто закрытый конструктор в наследниках. Может кто сможет что придумать?
ЗЫ: по-нормальному конструкторы наследоваться не должны, в пхп наследуются :(
Не бойся прыгнуть в пустоту |
| |
|
|
| Olegat |
Опубликовано 22-07-2010 20:15
|

Пользователь
Сообщений: 473
Зарегистрирован: 01.02.06
|
Вы скажите, что вам надо, может без классов и конструкторов уже есть… |
| |
|
|
| bambr |
Опубликовано 05-08-2010 17:13
|

Пользователь
Сообщений: 171
Зарегистрирован: 09.03.08
|
Да я так - извилинами поскрипеть иногда охота
Не бойся прыгнуть в пустоту |
| |
|
|
| Olegat |
Опубликовано 05-08-2010 21:54
|

Пользователь
Сообщений: 473
Зарегистрирован: 01.02.06
|
bambr написал:
Да я так - извилинами поскрипеть иногда охота 
Fusion, пока, позволяет себя ковырять только со знаниями процедурного программирования. За это его и ценят. Очевидно, создатели поняли, что напрягаться в изучении ООП ни кто не хочет…
…т.к. выгода для многих нулевая. В основном все можно сделать без ООП. Для кого есть от ООП выгода – те строят свою CMS. |
| |
|
|
| admin |
Опубликовано 10-08-2010 08:26
|

Супер Администратор
Сообщений: 4424
Зарегистрирован: 05.11.04
|
Согласен, скрип мозгов способствует прогрессу))))
Какой вопрос - такой ответ! |
| |
|
|
| Olegat |
Опубликовано 10-08-2010 10:30
|

Пользователь
Сообщений: 473
Зарегистрирован: 01.02.06
|
У меня ошибку показал в стр.13 $name = static::__CLASS__;
заругался на слово static
потом заругался на стороки 48 и 49
Увидеть Script start и достать строки из классов А и B удалось только из под модификатора public
Script start
A::Foo called!
B::Foo called!
PHP <?php echo "Script start<br>"; class Singleton { protected static $m_Instance; public static function Instance() { if( !isset( $m_Instance ) ) { $name = __CLASS__; $m_Instance = new $name; echo "Singleton construct<br>"; } return $m_Instance; } } class A extends Singleton { private function __construct() { echo "A construct<br>"; } public function foo() { echo "A::Foo called!<br>"; } } class B extends Singleton { private function __construct() { echo "B construct<br>"; } public function foo() { echo "B::Foo called!<br>"; } } echo A::foo(); echo B::foo(); ?>
Изменил(а) Olegat, 10-08-2010 10:33 |
| |
|
|
| bambr |
Опубликовано 16-08-2010 18:20
|

Пользователь
Сообщений: 171
Зарегистрирован: 09.03.08
|
Дело в том, что __CLASS__ в одиночке всегда будет равен Singleton
Не бойся прыгнуть в пустоту |
| |
|
|
| Olegat |
Опубликовано 18-08-2010 18:22
|

Пользователь
Сообщений: 473
Зарегистрирован: 01.02.06
|
Мой хостинг не потянул static::__CLASS__;
выдал ошибку... |
| |
|
|
| admin |
Опубликовано 19-08-2010 07:50
|

Супер Администратор
Сообщений: 4424
Зарегистрирован: 05.11.04
|
Хостинг должен все тянуть!
Слава богу щас хостеров как....выбирай, но осторожно))
Какой вопрос - такой ответ! |
| |
|
|
| bambr |
Опубликовано 21-08-2010 15:10
|

Пользователь
Сообщений: 171
Зарегистрирован: 09.03.08
|
Olegat написал:
Мой хостинг не потянул static::__CLASS__;
выдал ошибку...
это и есть ошибка 
я тоже думал сначала, что так можно
Не бойся прыгнуть в пустоту |
| |
|
|
| foxfolder |
Опубликовано 26-08-2010 09:08
|
Пользователь
Сообщений: 273
Зарегистрирован: 11.11.07
|
Olegat написал:
bambr написал:
Да я так - извилинами поскрипеть иногда охота 
Fusion, пока, позволяет себя ковырять только со знаниями процедурного программирования. За это его и ценят. Очевидно, создатели поняли, что напрягаться в изучении ООП ни кто не хочет…
…т.к. выгода для многих нулевая. В основном все можно сделать без ООП. Для кого есть от ООП выгода – те строят свою CMS.
потроллю немного)))
Olegat, извини, но сказал ты полнейшую глупость
Плагины и моды для php-fusion. Перенос на другие CMS.
Техническая поддержка и платные консультации.
foxel.ru |
| |
|
|
| Olegat |
Опубликовано 29-08-2010 19:04
|

Пользователь
Сообщений: 473
Зарегистрирован: 01.02.06
|
Olegat, извини, но сказал ты полнейшую глупость
Вы не обратили внимание - тема уже старая, а в ней только «тролли» в ООП, и вы не стали исключением? Т.к. люди ждут решения, а не придури и клоунад.
И это всё при вашем то стаже в ООП…
Изменил(а) Olegat, 29-08-2010 19:06 |
| |
|