/*Абстрактный класс*/
abstract class CBase{
abstract public function baseFunction();
}
/*Класс наследник 1
использует Синглтон
*/
class CClass_1 extends CBase{
static private $instance=null;
private function __construct(){}
private function __clone(){}
static public function getInstance(){
if(self::$instance==null)
self::$instance=new CClass_1();
return self::$instance;
/*и определение функции baseFunction()*/
.......
}
/*Таких классов наследников несколько CClass_1,CClass_2,CClass_3 все используют Синглтон*/
Добавляю Фабрику
class CBaseFactory{
private function __construct(){}
private function __clone(){}
/**
*
* @param string $name - критерий выбора стратегии
*/
static public function create($name){
switch($name){
case 'a':return CClass_1::getInstance();break;
case 'b':return CClass_2::getInstance();break;
case 'c':return CClass_3::getInstance();break;
default:break;
}
}
Собственно, теперь о самой проблеме ...
Когда я инициализирую Фабрику....
$obj=CBaseFactory::create('a');
/*этот вызов не работает*/
$obj->baseFunction();
Возникает ошибка:
Fatal error: Call to a member function baseFunction() on a non-object in ....
Начал разбираться и обнаружил что $obj после инициализации Фабрикой равен NULL.
Собственно какие у кого есть мысли?
Спустя 16 минут, 4 секунды (7.11.2011 - 17:39) caballero написал(а):
у тебя уже есть фабричный метод у класса
нафига еще фабрика отдельно, если она не создает экземпляры самостоятельно?
масло масляное
и по моему быстрее дебагером пройтись - визуально вроде все путем
нафига еще фабрика отдельно, если она не создает экземпляры самостоятельно?
масло масляное
и по моему быстрее дебагером пройтись - визуально вроде все путем
Спустя 15 минут, 34 секунды (7.11.2011 - 17:55) CJ_Junyor написал(а):
Наличие или отсутствие класса Фабрики ничего не меняет...
На сколько я понял основная проблема в Синглтоне .... но вот почему он возвращает не объект а NULL.. вот это вопрос?
$name='c';
switch($name){
case 'a': $obj=CClass_1::getInstance();break;
case 'b': $obj=CClass_2::getInstance();break;
case 'c': $obj=CClass_3::getInstance();break;
default:break;
}
print_r($obj); // return NULL
$obj->baseFunction();
/*Та же самая ошибка
Fatal error: Call to a member function baseFunction() on a non-object in ....
*/
На сколько я понял основная проблема в Синглтоне .... но вот почему он возвращает не объект а NULL.. вот это вопрос?
Спустя 6 минут, 6 секунд (7.11.2011 - 18:01) caballero написал(а):
просто сделай вызов CClass_1::getInstance() и посмотри что вернет
если null попробуй убрать базовый клас
кстати PHP какой версии?
если null попробуй убрать базовый клас
кстати PHP какой версии?
Спустя 7 минут, 52 секунды (7.11.2011 - 18:09) CJ_Junyor написал(а):
Цитата (caballero @ 7.11.2011 - 15:01) |
просто сделай вызов CClass_1::getInstance() и посмотри что вернет если null попробуй убрать базовый клас кстати PHP какой версии? |
Так, не знаю что произошло... но прогресс уже есть ))
Прямой вызов CClass_1::getInstance() - уже возвращает объект ...
Но, если использовать $obj=CBaseFactory::create('a');
То $obj по прежнему NULL;
PHP v.5.2.17
Спустя 3 минуты, 55 секунд (7.11.2011 - 18:13) caballero написал(а):
со свичем разберись - попробуй числа
по моему по строкам он работает начиная с какой то версии
и кстати break; там не нужно если return
по моему по строкам он работает начиная с какой то версии
и кстати break; там не нужно если return
Спустя 1 час, 47 минут, 46 секунд (7.11.2011 - 20:01) Guest написал(а):
покажи метод baseFunktion в CClass_1. я думаю проблема в self
Спустя 4 минуты, 24 секунды (7.11.2011 - 20:05) SlavaFr написал(а):
Цитата (Guest @ 7.11.2011 - 17:01) |
покажи метод baseFunktion в CClass_1. я думаю проблема в self |
sorry я забыл зарегистрироватся
Спустя 11 часов, 57 минут, 41 секунда (8.11.2011 - 08:03) linker написал(а):
Вообще switch пофигу строки там или цифры, от версии не зависит никак. У меня PHP 5.3.x и код ТС работает. Ошибок я не вижу, пока. Понаставляй echo чего-нибудь в ключевых точках и посмотри. В case default что-нибудь возвращай чтоб было понятно, что никакое условие не подошло.