[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Паттерн Factory
CJ_Junyor
У меня есть несколько классов реализованных при помощи паттерна Стратегии


/*Абстрактный класс*/
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 написал(а):
Наличие или отсутствие класса Фабрики ничего не меняет...



$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 какой версии?

Спустя 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

Спустя 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 что-нибудь возвращай чтоб было понятно, что никакое условие не подошло.
Быстрый ответ:

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