Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Как реализовать общее хранилище объектов классов
Форумы портала PHP.SU » » Объектно-ориентированное программирование » Как реализовать общее хранилище объектов классов

Страниц (1): [1]
 

1. Designer - 27 Июня, 2014 - 20:21:31 - перейти к сообщению
Всем здрасьте!
Вобщем суть заключается в следующем, на входе имеется класс который принимает некоторый массив с параметрами, проверяет их, и производит цикличное подключение и создание нескольких объектов классов(6 штук), записывая созданные объекты в общий массив с соответствующими именами! Некоторые из этих классов могут использовать методы друг друга(к примеру есть класс логирования и класс расширений, так вот класс расширений использует методы из класса логирования)
Так вот как можно реализовать данную систему что бы структура доступа к массиву с объектами сохранялась и была доступна из каждого объекта класса

Вот примерно такая
$this->Objects - общий массив с объектами классов
$this->Objects->Debugging
$this->Objects->Extension
$this->Objects->Registry
и т.д. ( в примере привел вызов классов как свойство объекта, по той причине что хочу преобразовать массив в object)

По сути понимаю общую картину, должно получиться что то типо глобального супер класса в котором будет храниться все!
Попробовал систему наследований, ничего не вышло(возможно что то неправильно делал), инкапсуляция не подходит, хотелось вы собрать 6 колесный велосипед по аналогии системы наследования, таким образом что бы в дальнейшем после запуска системы, в каждом классе был доступ к любому них!

Что можете подсказать по этому поводу?
(Добавление)
И еще хотелось бы добавить про то почему именно что типо наследования, дело в том что классы как я уже писал выше подключаются и создаются на автомате!
Я просто пытаюсь написать что то типо микро фреймворка(просто набираюсь опыта) и хочу добится такой структуры с системе, что бы не нужно было вызывать в каждом классе к примеру класс синглтон в котором будет находится этот массив с объектами, а что бы все происходило на автомате, то есть к примеру если взять определенный контроллер и унаследовать его от вот этого самого глобального супер класса то внутри контроллера можно будет использовать те самые объекты классов о которых я писал выше
2. caballero - 27 Июня, 2014 - 22:07:48 - перейти к сообщению
не очень понятно зачем обьекты сваливать в массив да еще и прнобразовывать массив в какой то обьект. Такоетощущение что вы не очень понимаете разницу между классом и объектом.
3. Designer - 27 Июня, 2014 - 22:15:15 - перейти к сообщению
caballero, приветствую! Я очень хорошо понимаю разницу между массивом и объектом! Тут не в этом суть! Суть в том что хотелось бы иметь во всей системе одну древовидную структуру!
Если быть еще точнее, вот конкретно что именно не получается реализовать, это то, что бы классы которые подключаются и создаются в цикле знали о существовании друг друга! последовательное наследование это тоже не то что нужно!
4. DelphinPRO - 27 Июня, 2014 - 22:16:48 - перейти к сообщению
Designer пишет:
По сути понимаю общую картину, должно получиться что то типо глобального супер класса в котором будет храниться все!


Паттерн программирования "Registry".

PHP:
скопировать код в буфер обмена
  1. class Registry {
  2.  
  3.         private static $storage = array();
  4.        
  5.         public static function set($name, $value) {
  6.                 self::$storage[$name] = $value;
  7.         }
  8.        
  9.         public static function get($name) {
  10.                 return isset(self::$storage[$name]) ? self::$storage[$name] : null;
  11.         }
  12. }


использование

PHP:
скопировать код в буфер обмена
  1. Registry::set('debug', new Debugging ());
  2. Registry::set('extension', new Extension ());
  3.  
  4. Registry::get('debug')->log('Some message...');
5. teddy - 27 Июня, 2014 - 22:22:43 - перейти к сообщению
Designer
А зачем Вам понадобился массив объектов во всех классах? Вы же не будете использовать в каждом классе все эти объекты. Они должны быть созданы только тогда когда в них есть необходимость. Я думаю лучше использовать autoload.

Designer пишет:
Некоторые из этих классов могут использовать методы друг друга

Если это происходит внутри самого класса, то обычно это плохая практика.

1. По хорошему каждый класс должен описывать решение одной задачи
2. Плохо, когда есть неоправданная зависимость, стремитесь к адекватной абстракции
6. Designer - 27 Июня, 2014 - 22:25:29 - перейти к сообщению
DelphinPRO, спасибо конечно за предоставленный код, но это уже реализовано!
Вобщем попробую еще раз объяснить.

Есть класс загрузчик системы, он внутри себя подключает 6 файлов в цикле и в этом же цикле создает их объекты то есть
PHP:
скопировать код в буфер обмена
  1.  
  2. $Libraries = Array(
  3.     'Benchmark',
  4.     'Registry',
  5.     'Debugging',
  6.     'Functions',
  7.     'Validation',
  8.     'Router',
  9.     'Database',
  10.     'Extension',
  11.     'Template'
  12. );
  13.  
  14. ForEach( $Library  as  $Class ) {
  15.     FileInclude( DirName( __FILE__ ) . '/library/' . $Class . '.php' );
  16.     $Objects[$Class] = new $Class();
  17. }
  18.  


Так вот тут и начинается проблема, они внутри не знают друг о друге! И я не могу понять как реализовать систему единого массива со всеми объектами этих классов таким образом что бы внутри них можно было друг другом пользоваться, я конечно делал инкапсуляцию последовательную, но этот тип реализации не совсем хорошо!
(Добавление)
teddy, по поводу второго пункта, почему неоправданная зависимость?
допустим в каждом классе можно использовать для отладки методы класса Benchmark ( то есть подсчет времени выполнения того или иного метода) а так же Debugging ( для записи логов)

И что происходит далее если конечно реализую такую систему, при подключении контроллера, он как бы наследуется и получает доступ в этому самому массиву с объектами
и внутри контроллера я уже вызываю нужное мне расширение(иными словами модель что было понятно) а так же проверяю данные url строки по ключу из объекта Router и так далее, плюс объект класса Extension, внутри себя имеется метод подгрузки и создания расширения ( и при написании кода расширения в файле, я само собой буду имень доступ к БД или Registry, то есть по необходимости можно будет воспользоваться любым классом, вместо того что бы их постоянно создавать) , я пытаю сделать систему что бы подключить базовые классы, создать их объекты запомнить их с 1 хранилище и получать доступ по аналогии привиденной в 1 посте
(Добавление)
Вот такая вот замудренная система!
(Добавление)
Я не скажу что возможно это правильный подход в построении, но на данный момент(да и вообще для практики) хотелось бы попробовать такое реализовать! 1 единственный момент на данном этапе не позволяет реализовать это, он описан в 3 посте!
(Добавление)
Ребят если есть у кого немного времени свободного хотя бы минут 15-20, оставьте свой скайп в ЛС, хотелось бы с обьяснить ситуацию во первых словами, а во вторых выслушать мнение и возможность реализации от более профессионального человека! Если конечно не трудно
7. teddy - 27 Июня, 2014 - 22:49:55 - перейти к сообщению
Designer пишет:
допустим в каждом классе можно использовать для отладки методы класса Benchmark

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

Designer пишет:
а так же Debugging ( для записи логов)

А кто Вам мешает делать логирование за пределами класса?

Designer пишет:
при подключении контроллера, он как бы наследуется и получает доступ в этому самому массиву с объектами

Вы наверное не знаете про autoload(говорю, исходя из приведенного Вами кода с подключением классов), почитайте обязательно:
http://www.php.net/manual/ru/fun...oad-register.php
8. Designer - 27 Июня, 2014 - 22:52:47 - перейти к сообщению
teddy, да да, упустил описать этот момент, я о нем конечно же знаю и прочитал в вашем сообщении, но даже если я буду его использовать, ситуацию автолоад не изменит!
9. caballero - 27 Июня, 2014 - 23:16:52 - перейти к сообщению
Цитата:
Так вот тут и начинается проблема, они внутри не знают друг о друге!

а зачем обьекту database или debugger знать о роутере или router о template ?

Цитата:
проверяю данные url строки по ключу из объекта Router

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

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

Цитата:
ситуацию автолоад не изменит

разумеется неумение програмировать никакой автолоад не изменит. Почему бы вам не взять несколько фреймворков , известных, с хорошим описанием и не посмотреть как делают профессиональные команды. начните с того же CodeIgniter
там и доки и русское комюнити.
10. Designer - 27 Июня, 2014 - 23:29:42 - перейти к сообщению
Цитата:
а зачем обьекту database или debugger знать о роутере или router о template ?

Я понимаю конечно к чему вы клоните! тут не в этом суть, поймите! Все эти классы, они все равно обязаны быть подключены в начале выполнения, понимаете?! и использование того или иного класса само собой будет происходить по назначению в соответствующих местах!
А то что вы пишите зачем классу БД знать о роутере или шаблоне, на это могу ответить обратное, а что мешает вызвать класс роутера допустим в методе класса работы с БД?! само собой ничего, но ведь все должно быть на своих местах, верно?! так вот и пользоваться необходимым классом в нужном месте, в данной системе можно будет без необходимости создания нового экземпляра, потому как повторюсь они один фиг создаются в самом начале при инициализации системы(потому как идет разбор url затем проверка существования файла контроллера наличие в нем класса и т.д.)
11. caballero - 27 Июня, 2014 - 23:43:48 - перейти к сообщению
Цитата:
Я понимаю конечно к чему вы клоните!

сомневаюсь.

Цитата:
Все эти классы, они все равно обязаны быть подключены в начале выполнения, понимаете?!

куда подключены? в начале выполнения чего?

Цитата:
и использование того или иного класса само собой будет происходить по назначению в соответствующих местах!

так зачем их подключать в каком то "начале" если неизвестно будет ли класс вообще использоватся? К примеру зашли на страницу а роутер перекинул на другую. ну и нафига тут все остальные классы?

Цитата:
а что мешает вызвать класс роутера допустим в методе класса работы с БД

наличие здравого смысла. Даже не представляю ситуацию зачем такое может понадобится.

Цитата:
но ведь все должно быть на своих местах, верно
КО подтверждает. Но по какому принципу определяются эти "места" ?

Цитата:
в данной системе можно будет без необходимости создания нового экземпляра
синглетон решает эту задачу в любой системе

Цитата:
они один фиг создаются в самом начале при инициализации системы(потому как идет разбор url затем проверка существования файла контроллера наличие в нем класса и т.д.)

зачем создавать то что может не понадобится (см. коментарий выше)? А синглетон создает экземпляр при первом обращении к нему.
12. armancho7777777 - 28 Июня, 2014 - 22:09:41 - перейти к сообщению
caballero пишет:
Почему бы вам не взять несколько фреймворков , известных, с хорошим описанием и не посмотреть как делают профессиональные команды.

+1
13. LIME - 29 Июня, 2014 - 00:21:39 - перейти к сообщению
Designer ты в упор не видишь что в примере DelphinPRO используется статическое свойство?
caballero пишет:
на фига контроллеру лезть к роутеру.
иногда лезет
в Symfony роутер может создать объект из модели чтоб проверить его существование и отдать 404 если нет
и в контроллере он сразу доступен через роутер

 

Powered by ExBB FM 1.0 RC1