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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Как реализовать общее хранилище объектов классов

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Без описания
Designer
Отправлено: 27 Июня, 2014 - 20:21:31
Post Id


Гость


Покинул форум
Сообщений всего: 66
Дата рег-ции: Нояб. 2011  


Помог: 0 раз(а)




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

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

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

Что можете подсказать по этому поводу?
(Добавление)
И еще хотелось бы добавить про то почему именно что типо наследования, дело в том что классы как я уже писал выше подключаются и создаются на автомате!
Я просто пытаюсь написать что то типо микро фреймворка(просто набираюсь опыта) и хочу добится такой структуры с системе, что бы не нужно было вызывать в каждом классе к примеру класс синглтон в котором будет находится этот массив с объектами, а что бы все происходило на автомате, то есть к примеру если взять определенный контроллер и унаследовать его от вот этого самого глобального супер класса то внутри контроллера можно будет использовать те самые объекты классов о которых я писал выше
 
 Top
caballero
Отправлено: 27 Июня, 2014 - 22:07:48
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




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


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
Designer
Отправлено: 27 Июня, 2014 - 22:15:15
Post Id


Гость


Покинул форум
Сообщений всего: 66
Дата рег-ции: Нояб. 2011  


Помог: 0 раз(а)




caballero, приветствую! Я очень хорошо понимаю разницу между массивом и объектом! Тут не в этом суть! Суть в том что хотелось бы иметь во всей системе одну древовидную структуру!
Если быть еще точнее, вот конкретно что именно не получается реализовать, это то, что бы классы которые подключаются и создаются в цикле знали о существовании друг друга! последовательное наследование это тоже не то что нужно!
 
 Top
DelphinPRO
Отправлено: 27 Июня, 2014 - 22:16:48
Post Id



Активный участник


Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012  


Помог: 353 раз(а)




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...');

(Отредактировано автором: 27 Июня, 2014 - 22:17:10)



-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
teddy
Отправлено: 27 Июня, 2014 - 22:22:43
Post Id


Участник


Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013  


Помог: 91 раз(а)




Designer
А зачем Вам понадобился массив объектов во всех классах? Вы же не будете использовать в каждом классе все эти объекты. Они должны быть созданы только тогда когда в них есть необходимость. Я думаю лучше использовать autoload.

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

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

1. По хорошему каждый класс должен описывать решение одной задачи
2. Плохо, когда есть неоправданная зависимость, стремитесь к адекватной абстракции
 
 Top
Designer
Отправлено: 27 Июня, 2014 - 22:25:29
Post Id


Гость


Покинул форум
Сообщений всего: 66
Дата рег-ции: Нояб. 2011  


Помог: 0 раз(а)




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, оставьте свой скайп в ЛС, хотелось бы с обьяснить ситуацию во первых словами, а во вторых выслушать мнение и возможность реализации от более профессионального человека! Если конечно не трудно
 
 Top
teddy
Отправлено: 27 Июня, 2014 - 22:49:55
Post Id


Участник


Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013  


Помог: 91 раз(а)




Designer пишет:
допустим в каждом классе можно использовать для отладки методы класса Benchmark

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

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

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

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

Вы наверное не знаете про autoload(говорю, исходя из приведенного Вами кода с подключением классов), почитайте обязательно:
http://www.php.net/manual/ru/fun...oad-register.php

(Отредактировано автором: 27 Июня, 2014 - 22:50:30)

 
 Top
Designer
Отправлено: 27 Июня, 2014 - 22:52:47
Post Id


Гость


Покинул форум
Сообщений всего: 66
Дата рег-ции: Нояб. 2011  


Помог: 0 раз(а)




teddy, да да, упустил описать этот момент, я о нем конечно же знаю и прочитал в вашем сообщении, но даже если я буду его использовать, ситуацию автолоад не изменит!
 
 Top
caballero
Отправлено: 27 Июня, 2014 - 23:16:52
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




Цитата:
Так вот тут и начинается проблема, они внутри не знают друг о друге!

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

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

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

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

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

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


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
Designer
Отправлено: 27 Июня, 2014 - 23:29:42
Post Id


Гость


Покинул форум
Сообщений всего: 66
Дата рег-ции: Нояб. 2011  


Помог: 0 раз(а)




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

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


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




Цитата:
Я понимаю конечно к чему вы клоните!

сомневаюсь.

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

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

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

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

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

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

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

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

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

зачем создавать то что может не понадобится (см. коментарий выше)? А синглетон создает экземпляр при первом обращении к нему.

(Отредактировано автором: 27 Июня, 2014 - 23:44:42)



-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
armancho7777777 Супермодератор
Отправлено: 28 Июня, 2014 - 22:09:41
Post Id



Активный участник


Покинул форум
Сообщений всего: 4526
Дата рег-ции: Февр. 2011  
Откуда: Москва


Помог: 221 раз(а)




caballero пишет:
Почему бы вам не взять несколько фреймворков , известных, с хорошим описанием и не посмотреть как делают профессиональные команды.

+1
 
 Top
LIME
Отправлено: 29 Июня, 2014 - 00:21:39
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




Designer ты в упор не видишь что в примере DelphinPRO используется статическое свойство?
caballero пишет:
на фига контроллеру лезть к роутеру.
иногда лезет
в Symfony роутер может создать объект из модели чтоб проверить его существование и отдать 404 если нет
и в контроллере он сразу доступен через роутер
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Объектно-ориентированное программирование »


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



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB