[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Использовать ли лазейку в PHP? ООП???
SitnikovArtur
Есть подобие синглтона, выглядит так:


class a
{
public static function singleton($method, $param = '')
{
static $data = NULL;
if (isset($data[$method])) return $data[$method];

$data[$method] = self::$method($param);
return $data[$method];
}
}



Смысл от него один - взяв однажды с помощью него данные (например из базы данных MYSQL, передав ему имя метода), второй и все последующие разы PHP в базу уже не полезет.

Но бывают ситуации, когда второй параметр невозможно передать. Это конечно грустно, но ничего не поделать - особенность архитектуры, только все переделывать видимо...

Так вот самое что интересное во всем этом, это то, что второй раз синглтон корректно работает независимо от второго параметра. То есть если однажды я его вызвал с двумя параметрами, то чтобы потом получить доступ к данным второй параметр можно уже не передавать.

Вообще-то меня это устраивает, вот только если вырезать некоторые методы, они уже не будут работать самостоятельно, а очень надо.

Как с этим можно поступить? Оставить как есть, комментируя этот баг архитектуры, или как нибудь пограмотней переделать, с минимальными изменениями кода?

Я думал так:
Создать в классе переменную, а потом присвоить ей результат работы синглтона.
Что-то типа:

class a
{
public $data = NULL;
}

А потом присвоить ей результат работы синглтона. Но получается что другие классы как не знали ничего о том, что такое $data, так и не будут знать.
Объявления не нужны, хочу их избежать ($a = new a();), чтобы внести как можно меньше изменений.

Короче я нуб в ООП, или к чему это относится, и не знаю что делать.

Пример кода, с которым проблемы:
 class a
{
function singleton($method, $param = '')
{
static $data = NULL;
if (isset($data[$method])) return $data[$method];

$data[$method] = self::$method($param);
return $data[$method];
}
// возвращает данные, которые много где потребуются
function a1($a1)
{
return 'test-' . $a1;
}

function a2($x)
{
$a2 = self::singleton('a1', $x);
// работа с данными
}
function a3($y)
{
// эта функция не может принять параметр $x
// потому как она вызывается родными php функциями
// которые сами передают в нее данные
// например preg_replace_callback()

$a3 = self::singleton('a1', 'Недоступно');
}
}


// если сначала вызвать a::a2('тест'); // в кеше : test-тест
// то preg_replace_callback($pattern, 'a::a3', $subject);
// отработает правильно,
// но без объявления a::a2('тест');
// a::a3 отработает некорректно


Честно говоря чешу затылок...



Спустя 4 часа, 52 минуты, 38 секунд (3.05.2012 - 04:29) Joker написал(а):
а что за патерн юзается?) т.к. к сингелтону это вообще не имеет отношения.

Спустя 1 час, 23 минуты, 11 секунд (3.05.2012 - 05:52) glock18 написал(а):
это http://en.wikipedia.org/wiki/Lazy_loading

реализация сомнительная, и надо переделывать. как? зависит от того, что получить хотите. и я не совсем понял, причем здесь лазейка в php - поведение полностью соответствует тому, что вы там понаписали. Насколько я понимаю это, поскольку вы так и не сказали даже, что значит
// но без объявления a::a2('тест'); 
// a::a3 отработает некорректно


имеется ввиду, что будет вызвано без параметра?

PS: как бы то ни было, сейчас все сделано совершенно нелепо, потому что переданные ранее параметры никак не отслеживаются, да и совершенно безразличны по большому счету после того, как метод отработал. Ну, как минимум, а если надо будет еще раз этот метод выполнить с другими параметрами, что тогда?

Спустя 7 часов, 50 минут, 17 секунд (3.05.2012 - 13:42) SitnikovArtur написал(а):
glock18
>а если надо будет еще раз этот метод выполнить с другими параметрами, что тогда?

На этот случай в функцию singleton нужно передать третий параметр false, который не указан в примере, так как писал для простоты понимания проблемы. На самом деле ф-ия singleton немного сложнее, я ее укоротил.

Реализация очень сомнительна, я это понимаю, но не могу решить , почему и поднял тему.

Приведенный пример из википедии я посмотрел, но это тоже не помогает.

Вот что мне нужно, разумеется не работает, так как неверный синтакси.
 class x
{
public $x = '';
function __construct()
{
$this->x = 'str';
}
function x1()
{
echo $this->x;
}
function x2()
{
echo $this->x;
}
}

x::x1();
x::x2();


Есть этому корректно работающая альтернатива?
Важно, чтобы неизменными остались вызовы:
x::x1();
x::x2();
Если оставить вызовы функций не представляется возможным, то буду заканчивать как есть, сейчас нет времени переписывать весь проект из-за одной preg_replace_callback.

Спустя 1 час, 4 минуты, 58 секунд (3.05.2012 - 14:47) glock18 написал(а):
ужасы какие.. ну поставьте обращение к синглтону в каждый метод, раз вызов вам нужно таким же оставить по каким-то причинам


_____________
Не к каждой каптче можно написать антикаптчу ©
Быстрый ответ:

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