[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Синготон из ArrayObject
Quieteroks
Доброго времени суток.

Хочу перейти на нативный шаблонизатор, но своего производства.
В связи с чем, хочется реализовать ArrayObject, для доступа к данным класса.
Задумка в том, что бы избавиться от $this->key и сделать $tpl['key'].
Думаю реализовывать то, что уже реализовано разработчиками не стоит, но класс требует открытый конструктор, а для моей задумки, нужен закрытый. Можно взять готовые аналоги, но сколько не ищу, нормальных реализаций нет еще...

Поэтому интересно Ваше мнение, как можно сделать подобие сингтона для данного класса?
Ну или может кто видел наиболее удачную реализацию всех массивных интерфейсов...



Спустя 21 минута, 33 секунды (4.10.2012 - 21:20) Игорь_Vasinsky написал(а):
инициализируй

 $tpl['key']=$this->key;

Спустя 11 минут, 23 секунды (4.10.2012 - 21:32) Quieteroks написал(а):
Игорь_Vasinsky
Для каждой переменной в классе, перед распечаткой шаблона, проводить подобную процедуру? Чет я недопонял...

Спустя 7 минут, 12 секунд (4.10.2012 - 21:39) Guest написал(а):
А разве нельзя перегрузить конструктор ArrayObject и сделать его приватным в своём классе. Только что попробовал, интерпретатор не ругается.

Спустя 4 минуты, 39 секунд (4.10.2012 - 21:44) Quieteroks написал(а):
Guest
У меня ругался. Поэтому и вопрос появился.
А может я не так переопределял...

class myArray extends ArrayObject {
private __construct() {}
}

Как то так вроде...

Спустя 6 минут, 38 секунд (4.10.2012 - 21:50) Guest написал(а):
Он ругался на некорректный синтаксис определения метода (конструктора) ;)
class myArray extends ArrayObject {
private function __construct() {}
}

Спустя 7 часов, 40 минут, 55 секунд (5.10.2012 - 05:31) Quieteroks написал(а):
Guest
Это я просто здесь пропустил слово...
А ошибка гласила, что конструктор должен быть открытым.

Кстати дочитался, почему это не сработало...
http://php.net
Цитата
Все методы перегрузки должны быть объявлены как public.

Спустя 5 часов, 55 минут, 24 секунды (5.10.2012 - 11:27) bodja написал(а):
Ну так а в чем собственно беда ,что конструктор не закрытый? biggrin.gif

Спустя 22 минуты, 45 секунд (5.10.2012 - 11:49) Quieteroks написал(а):
bodja
В том что случайно могу создать второй экземпляр или переписать ранее наработанное... И в итоге вместо нужных 10 ключей будет только один, последний...

Спустя 1 час, 16 минут, 36 секунд (5.10.2012 - 13:06) -=CASPER=- написал(а):
Если нужен Singleton то на ум ничего не приходит как создать такой класс:
class myArray {

static private $instanse = NULL;

private function __construct() {}
private function __clone() {}
private function __wakeup() {}

/**
* Инициализация текущего класса
*
*
@return \myArray
*/

static public function registory() {
if(self::$instanse === NULL) {
self::$instanse = new self();
}

return self::$instanse;
}

/**
* Инициализация ArrayObject
*
*
@param array $array
*
@return \ArrayObject
*/

public function setArray(array $array) {
return new ArrayObject($array);
}

}



$my = myArray::registory()->setArray($myArray);

Но посути ArrayObject не является Singleton. Singleton'ом будет класс myArray.

Спустя 34 минуты, 53 секунды (5.10.2012 - 13:41) Guest написал(а):
Цитата
Если нужен Singleton то на ум ничего не приходит как создать такой класс:
-=CASPER=-
Здесь как раз задача подружить синтаксис обращения к объектным свойствам как к массиву и в то же время иметь только один экземпляр на протяжении всего сеанса работы программы.

Спустя 8 минут, 48 секунд (5.10.2012 - 13:50) Quieteroks написал(а):
-=CASPER=-
Т.е. это мы первый раз инициируем с передачей массива, а в последующем можем просто брать инстанс... Это у нас просто обертка для хранения нужного нам массива. Но тогда не лучше ли в метод registory записать создание объекта ArrayObject? Ведь если вызвать без метода setArray, то и класс не будет содержать нужный функционал.

Спустя 7 минут, 40 секунд (5.10.2012 - 13:57) Guest написал(а):

Спустя 4 минуты, 30 секунд (5.10.2012 - 14:02) Guest написал(а):
По первой ссылке первый способ просто проверяет контекст создания, а второй реализует интерфейсы такие же как у ArrayObject, добавляя паттерн Singlton к своему классу.

Спустя 11 минут, 55 секунд (5.10.2012 - 14:14) Quieteroks написал(а):
Guest
Вот первая ссылка мне весьма понравилась, а точнее второй вариант.
Большое спасибо.

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

Спустя 9 минут, 15 секунд (5.10.2012 - 14:23) -=CASPER=- написал(а):
Можно конечно и в registory создать ArrayObject:
class myArray {

static private $instanse = NULL;
private $object;


private function __construct() {}
private function __clone() {}
private function __wakeup() {}

/**
* Инициализация текущего класса
*
*
@param array $array
*
@return \myArray
*/

static public function registory(array $array) {
if(self::$instanse === NULL) {
self::$instanse = new self();
self::$instanse->object = new ArrayObject($array);
}

return self::$instanse;
}

/**
*
@return \ArrayObject
*/

public function getArrayObject() {
return $this->object;
}

}


#-------------#
$my = myArray::registory($array)->getArrayObject();
Быстрый ответ:

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