Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> __autoload: плюсы и минусы 
V
    Опции темы
Gold Dragon
Дата 19.1.2012, 07:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 10
Всего: 71



В последнее время с талкиваюсь с всё частым обращением к __autoload()
Но в тоже время появилось два противоположных мнения: или очень положительное или очень отрицательное. Именно нейтральных не особо много.

Вот и хотелось бы узнать, что такого "хорошего" и что такого "плохого" в этой __autoload()? Ну или проще, использовать ли мне это в своих проектах?


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
Absinthe
Дата 19.1.2012, 07:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 526
Регистрация: 4.5.2011

Репутация: 5
Всего: 11



Я отрицательно к ней отношусь: нельзя несколько функций назначить.

Положительно отношусь к spl_autoload_register и не вижу ни одной причины ее не использовать.
PM MAIL   Вверх
Sanchezzz
Дата 19.1.2012, 12:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1670
Регистрация: 19.11.2006
Где: Voronezh

Репутация: 41
Всего: 60



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

Absinthe не согласен из любой ситуации есть выход.


--------------------
Понравился ответ "+" по репе, не забываем закрывать тему, заказы в LS.
PM MAIL Skype GTalk   Вверх
Gold Dragon
Дата 19.1.2012, 12:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 10
Всего: 71



а как это всё же правильнее использовать (лучше на примере)?


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
ksnk
Дата 19.1.2012, 12:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Цитата(Sanchezzz @  19.1.2012,  12:16 Найти цитируемый пост)
Absinthe не согласен из любой ситуации есть выход.

Даже из ситуации, когда подключаемый к сайту сервис сам устанавливает __autoload ?

spl_autoload_register вместо __autoload просят применять даже на php.net. Нужна ли простому php-шнику ещё какая-то рекомендация?


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Gold Dragon
Дата 19.1.2012, 12:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 10
Всего: 71



т.е. я по идее могу забыть о своих способах подключения классов и использовать это?


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
ksnk
Дата 19.1.2012, 12:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Цитата(Gold Dragon @  19.1.2012,  12:25 Найти цитируемый пост)
т.е. я по идее могу забыть о своих способах подключения классов и использовать это? 

Да. Если нет необходимости поддерживать php-4, то нет никакого смысла не использовать встроенные в язык средства.


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Gold Dragon
Дата 19.1.2012, 12:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 10
Всего: 71



ну а в чём же её приимущества по сравнению с самописными средствами?


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
krundetz
Дата 19.1.2012, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вечный странник
***


Профиль
Группа: Завсегдатай
Сообщений: 1400
Регистрация: 14.6.2007
Где: НН(Сормово)

Репутация: 20
Всего: 69



Gold Dragon, в том что тебе дается нативная поддержка автозагрузки, то есть достаточно написать так:
Код

$obj = new ClassName();



--------------------
!цензоры - Хранитель стратегической жидкости
Группа ТГВ
Группа Нижний Новгород
user posted image
PM MAIL   Вверх
Absinthe
Дата 19.1.2012, 13:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 526
Регистрация: 4.5.2011

Репутация: 5
Всего: 11



Цитата

Absinthe не согласен из любой ситуации есть выход.
 Учи матчасть, ты просто не понял, что я написал.

Цитата

а как это всё же правильнее использовать (лучше на примере)?
 http://php.net/spl_autoload_register

Цитата

ну а в чём же её приимущества по сравнению с самописными средствами?
 В том, что на публичном хостинге работать будет, а полноценные самописные средства нет, т.к. придется самому компилировать. Потому что нельзя полноценный аналог написать не в виде сишного расширения.
Ну и еще в том, что написание аналогов стандартных функций всегда считается ###кодом, т.к. всегда ухудшает читаемость и поддержку кода.
PM MAIL   Вверх
krundetz
Дата 19.1.2012, 13:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вечный странник
***


Профиль
Группа: Завсегдатай
Сообщений: 1400
Регистрация: 14.6.2007
Где: НН(Сормово)

Репутация: 20
Всего: 69



Цитата(Absinthe @  19.1.2012,  13:10 Найти цитируемый пост)
Ну и еще в том, что написание аналогов стандартных функций всегда считается ###кодом, т.к. всегда ухудшает читаемость и поддержку кода. 

Не согласен, так как нужно исходить из задачи и требований, на хабре по моему была статейка где описывалась как раз такая ситуация, где нативное решение пришлось заменить своим.
Цитата(Absinthe @  19.1.2012,  13:10 Найти цитируемый пост)
Учи матчасть

Не будь хамом плиз.

Это сообщение отредактировал(а) krundetz - 19.1.2012, 13:18


--------------------
!цензоры - Хранитель стратегической жидкости
Группа ТГВ
Группа Нижний Новгород
user posted image
PM MAIL   Вверх
Absinthe
Дата 19.1.2012, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 526
Регистрация: 4.5.2011

Репутация: 5
Всего: 11



Цитата

из задачи и требований
 Аргументируй в контексте данной задачи.

Цитата

Не будь хамом плиз.
 Я не хамил. Нахамить я хочу лишь персонажу "супервладислав", но я его игнорирую - пока получается.
PM MAIL   Вверх
krundetz
Дата 19.1.2012, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вечный странник
***


Профиль
Группа: Завсегдатай
Сообщений: 1400
Регистрация: 14.6.2007
Где: НН(Сормово)

Репутация: 20
Всего: 69



Цитата(Absinthe @  19.1.2012,  14:34 Найти цитируемый пост)
Аргументируй в контексте данной задачи.

Просто поясню с чем я не согласен. А именно со словом всегда, вот в этом предложение:
Цитата(Absinthe @  19.1.2012,  13:10 Найти цитируемый пост)
всегда ухудшает читаемость и поддержку кода. 

В контексте же задачи топика безусловно это не оправдано.
Цитата(Absinthe @  19.1.2012,  14:34 Найти цитируемый пост)
Я не хамил.

ну значиться я не понял.


--------------------
!цензоры - Хранитель стратегической жидкости
Группа ТГВ
Группа Нижний Новгород
user posted image
PM MAIL   Вверх
Absinthe
Дата 19.1.2012, 15:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 526
Регистрация: 4.5.2011

Репутация: 5
Всего: 11



Цитата

Ну и еще в том, что написание аналогов стандартных функций
 Слово "аналог" однозначно и не допускает двоякого толкования. Прямо как наличие экстремизма в  Ветхом Завете.
Если что-то имеет дополнительный функционал - то это уже не аналог.
PM MAIL   Вверх
Sentox
Дата 19.1.2012, 23:50 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


как то так
**


Профиль
Группа: Участник
Сообщений: 392
Регистрация: 27.1.2009
Где: Зимбабве

Репутация: 7
Всего: 7



Вообщето многие опытные программисты и разработчики вроде Макконнелла и т.д.(специализирующиеся по "чистому коду") очень рекомендуют задавать явное подключение и разброс подключений по функциям, файлам и тем более классам крайне не желателен. Я согласен впринципе с ними, так как если поддержку, или чего хуже расширение системы, проводит сторонний разработчик или группа разработчиков (да ещё с более низкой специализацией) автолоад может несолько усложнить понимание архитектуры. Всегда желательно явная архитектура особенно в подключаемых файлах. Мало того фактически подключение ведётся в зависимости от абстракции, то есть в индексном файле - окружение, в фабриках - определённые классы абстракций, а использовать функцию для отдельного аспекта как то не резон, лучше всё таки определить это место явно впереди инстанцирования или в индексном файле.

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

Это сообщение отредактировал(а) Sentox - 19.1.2012, 23:54
PM MAIL   Вверх
Sanchezzz
Дата 20.1.2012, 06:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1670
Регистрация: 19.11.2006
Где: Voronezh

Репутация: 41
Всего: 60




spl_autoload_register вызывается только тогда класс не объявлен и при обращении к конкретному классу если он его не находит...

Код


spl_autoload_register('autoload_class');

function autoload_class($class){
    if(file_exists($_SERVER['DOCUMENT_ROOT'] . "/kernel/classes/" . $class . ".class.php")){
        include_once $_SERVER['DOCUMENT_ROOT'] . "/kernel/classes/" . $class . ".class.php";
    }
}




--------------------
Понравился ответ "+" по репе, не забываем закрывать тему, заказы в LS.
PM MAIL Skype GTalk   Вверх
MoLeX
Дата 20.1.2012, 07:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Местный пингвин
****


Профиль
Группа: Модератор
Сообщений: 4076
Регистрация: 17.5.2007

Репутация: 46
Всего: 140



Цитата(Sanchezzz @  20.1.2012,  06:42 Найти цитируемый пост)
spl_autoload_register вызывается только тогда класс не объявлен и при обращении к конкретному классу если он его не находит...

так же как и __autoload()


--------------------
Amazing  smile 
PM MAIL WWW ICQ   Вверх
Absinthe
Дата 20.1.2012, 08:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 526
Регистрация: 4.5.2011

Репутация: 5
Всего: 11



Цитата

очень рекомендуют задавать явное подключение
 Цитату из Макконела, пожалуйста.

Цитата

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

Цитата

автолоад может несолько усложнить понимание архитектуры
 Каким же образом? Да даже не усложнить, а просто повлиять на понимание? Любая IDE сама разберется, где какой файл подключается.

Цитата

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

Цитата

При различных видах подключений файлов определённых абстракций приходится обрабатывать ошибки по своему
 Зачем?
PM MAIL   Вверх
Sentox
Дата 20.1.2012, 22:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


как то так
**


Профиль
Группа: Участник
Сообщений: 392
Регистрация: 27.1.2009
Где: Зимбабве

Репутация: 7
Всего: 7



Цитата(Absinthe @ 20.1.2012,  08:11)

автолоад может несолько усложнить понимание архитектуры
 Каким же образом? Да даже не усложнить, а просто повлиять на понимание? Любая IDE сама разберется, где какой файл подключается.

[/QUOTE]
Честно говоря не хочется вступать в дискусию (всё таки это холивар чистой воды будет smile ).
У Макконнелла, если кто внимательно читал, всё "пропитано" простотой архитектуры и построения и если что то задаётся неявно и можно сделать проще - это нужно сделать. По поводу цитаты - можете сами у Макконнелла да и не только у него найти - пишите для людей (программистов) а не для IDE, да так что бы можно было читать код и не искать где производится включение кода (особенно если касается разработчиков работающих не с IDE (не будем разводить холивар что пора бы уже перебраться на них)). Это меня наводит на программистов на JS, которые пишут имена переменных и функций наподобие "btcdret", как говорится - повбывав бы smile)

Я бы сказал дискусия на тему _autoload() подобна применению директивы goto, так же неявно задаёт смысл читаемого кода.
Без цитат -  smile Макконнелл и его сторонники рекомендуют - прямолинейное "чтение" кода упрощает разработку и особенно  поддержку его последующими разработчиками.

Так же есть затруднение с переносимостью модулей (допустим модулей). При архитектруе фасад и фабрики мы могли бы модуль полностью сделать автономным, при "доверении" подключаемых файлов в __autoload мы лишаемся, некторой части автономности, а детальней при переносе в другой проект он уже потребует сторонних включений своих!!! же файлов, то есть мы перенесём знания структуры модуля во внешнюю структуру ... судите сами smile

Это сообщение отредактировал(а) Sentox - 20.1.2012, 22:54
PM MAIL   Вверх
krundetz
Дата 20.1.2012, 23:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вечный странник
***


Профиль
Группа: Завсегдатай
Сообщений: 1400
Регистрация: 14.6.2007
Где: НН(Сормово)

Репутация: 20
Всего: 69



Sentox, если я правильно понимаю назначание __autoload то это в превую очередь исключение дублирующих include и require, а eже потом все остальное

Это сообщение отредактировал(а) krundetz - 20.1.2012, 23:16


--------------------
!цензоры - Хранитель стратегической жидкости
Группа ТГВ
Группа Нижний Новгород
user posted image
PM MAIL   Вверх
Sentox
Дата 20.1.2012, 23:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


как то так
**


Профиль
Группа: Участник
Сообщений: 392
Регистрация: 27.1.2009
Где: Зимбабве

Репутация: 7
Всего: 7



Цитата(krundetz @ 20.1.2012,  23:16)
Sentox, если я правильно понимаю назначание __autoload то это в превую очередь исключение дублирующих include и require, а eже потом все остальное

Исключение дублирующих include и require - это include_once и require_once (при чём на уровне пхп машины!) всё остальное не должно это надстраивать если это уже до нас сделали.
PM MAIL   Вверх
ksnk
Дата 20.1.2012, 23:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Цитата(Sentox @  20.1.2012,  22:46 Найти цитируемый пост)
При архитектруе фасад и фабрики мы могли бы модуль полностью сделать автономным, при "доверении" подключаемых файлов в __autoload мы лишаемся, некторой части автономности

Можно на эту тему? Кто в фасаде и фабрике расскажет фабрике где находятся модули?
Не будет ли более корректно отвязать фабрику и фасад от информации о структуре файлов модуля и оставить им только собственную логику? Не повысит ли такая отвязка автономность модуля?


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Sentox
Дата 20.1.2012, 23:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


как то так
**


Профиль
Группа: Участник
Сообщений: 392
Регистрация: 27.1.2009
Где: Зимбабве

Репутация: 7
Всего: 7



Цитата(ksnk @ 20.1.2012,  23:21)
Цитата(Sentox @  20.1.2012,  22:46 Найти цитируемый пост)
При архитектруе фасад и фабрики мы могли бы модуль полностью сделать автономным, при "доверении" подключаемых файлов в __autoload мы лишаемся, некторой части автономности

Можно на эту тему? Кто в фасаде и фабрике расскажет фабрике где находятся модули?
Не будет ли более корректно отвязать фабрику и фасад от информации о структуре файлов модуля и оставить им только собственную логику? Не повысит ли такая отвязка автономность модуля?

Фактически фасад я упомянул так, для универсальности (скажем так пример модуля компилятора с фасадом к модулю (извините за тавталогию)), а вот фабрика может сама "знать" о с своей структуре и подключать файлы (хотя бы в switch (кстати хороший пример абстрактная фабрика, которая "отрывает" модуль от платформо - зависмости)). Допустим имеем одну фабрику (файл), который является так же и инфраструкторой модуля. При подключении одного файла - фабрики мы включаем в работу весь модуль не отдавая "знаний" включения его структурных файлов, а алгоритм использования модуля лежать может на интерфейсах фасада.

Впринципе это моё мнение.

Добавлено @ 23:39
Цитата(ksnk @ 20.1.2012,  23:21)
Не будет ли более корректно отвязать фабрику и фасад от информации о структуре файлов модуля и оставить им только собственную логику?

Фасад наверное да, скорее всего, а вот фабрика как раз и призвана локализировать по определённой категории, аспекту или абстракции инстанцирование и подключение объектов. Так что её алгоритм основной как раз в этом и состоит.

Добавлено через 12 минут и 33 секунды
Наверное и скорее всего _autoload будет применим к конкретному аспекту подключения основных скриптов ядра системы, хотя честно говоря я не сторонник этого, несколько безответственно даёт разработчикам вносить включения классов, и если система будет раздуваться это грозит сложностями.

Это сообщение отредактировал(а) Sentox - 20.1.2012, 23:40
PM MAIL   Вверх
ksnk
Дата 21.1.2012, 00:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Sentox, ТОесть, что свалить в одну кучу ДВА РАЗНЫХ механизма ( файловую структура модуля и фабричную логику) будет более правильно с точки зрения ООП, чем сделать 2 независимых друг от друга механизма? 


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Sentox
Дата 21.1.2012, 00:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


как то так
**


Профиль
Группа: Участник
Сообщений: 392
Регистрация: 27.1.2009
Где: Зимбабве

Репутация: 7
Всего: 7



Цитата(ksnk @ 21.1.2012,  00:08)
Sentox, ТОесть, что свалить в одну кучу ДВА РАЗНЫХ механизма ( файловую структура модуля и фабричную логику) будет более правильно с точки зрения ООП, чем сделать 2 независимых друг от друга механизма?

Начнём с первого:
к ООП это точно не относится smile,  (не люблю не аргументированных ответов) - так как ООП (как программирование так и проектирование) структурирует в основном (да ну в основном) данные и призвано к качественному манипулированию данными, но с инфраструтурой лучше справляется именно функциональные решения, поэтому вся инфраструктура может определена в одном методе (функции)

Второе:
вопросом на вопрос - в чём состоит суть фабрики (не абстрактной фабрики), и как лучше разделить аспекты подключения файловой структуры модуля и инстанциирование объектов из классов модуля?

Это сообщение отредактировал(а) Sentox - 21.1.2012, 00:24
PM MAIL   Вверх
ksnk
Дата 21.1.2012, 00:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Цитата(Sentox @  21.1.2012,  00:22 Найти цитируемый пост)
вопросом на вопрос - в чём состоит суть фабрики (не абстрактной фабрики), и как лучше разделить аспекты подключения файловой структуры модуля и инстанциирование объектов из классов модуля?

Спрашивая о "не абстрактной фабрике" стоит ее как то определить, не так ли? Фабрика, вообще говоря по символическому обозначению предоставляет некий конкретный объект. К примеру, по запросу "дай мне класс для отправки почты", в зависимости от конфигурации приложения и состояния сервера может выдать класс, основанный на mail, smtp или еще какой почтовой приблуде... Фабрика обязана знать КАК инициировать все эти разные классы, однако не обязана знать ГДЕ конкретно они находятся.

Вообще говоря, все разговоры вокруг ООП и стиля программирования обязаны приводить к удобству повторного использования кода. При повторном использовании такой фабрики, в приложении с другой файловой организацией, но с тем-же примерно комплектом серв-объектов, не придется переписывать ее вообще.


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Sentox
Дата 21.1.2012, 01:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


как то так
**


Профиль
Группа: Участник
Сообщений: 392
Регистрация: 27.1.2009
Где: Зимбабве

Репутация: 7
Всего: 7



Цитата(ksnk @ 21.1.2012,  00:57)
Цитата(Sentox @  21.1.2012,  00:22 Найти цитируемый пост)
вопросом на вопрос - в чём состоит суть фабрики (не абстрактной фабрики), и как лучше разделить аспекты подключения файловой структуры модуля и инстанциирование объектов из классов модуля?

Спрашивая о "не абстрактной фабрике" стоит ее как то определить, не так ли? Фабрика, вообще говоря по символическому обозначению предоставляет некий конкретный объект. К примеру, по запросу "дай мне класс для отправки почты", в зависимости от конфигурации приложения и состояния сервера может выдать класс, основанный на mail, smtp или еще какой почтовой приблуде... Фабрика обязана знать КАК инициировать все эти разные классы, однако не обязана знать ГДЕ конкретно они находятся.

Вообще говоря, все разговоры вокруг ООП и стиля программирования обязаны приводить к удобству повторного использования кода. При повторном использовании такой фабрики, в приложении с другой файловой организацией, но с тем-же примерно комплектом серв-объектов, не придется переписывать ее вообще.

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

Цитата

 Фабрика обязана знать КАК инициировать все эти разные классы, однако не обязана знать ГДЕ конкретно они находятся.

Да нет же, я ж писал выше, она является ещё и инфраструктурой, если хотите index.php для модуля (компонента).
И ещё как должна знать, если она "хочет" быть инфраструктурой модуля и единственной знающей единицей о структуре..

Всё же мой вопрос в силе? Я просто могу пример привести что при выходе "знаний" структуры наружу рушится целостность автономности.

Это сообщение отредактировал(а) Sentox - 21.1.2012, 02:05
PM MAIL   Вверх
Absinthe
Дата 21.1.2012, 07:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 526
Регистрация: 4.5.2011

Репутация: 5
Всего: 11



Цитата

Без цитат -   Макконнелл и его сторонники рекомендуют - прямолинейное "чтение" кода упрощает разработку и особенно  поддержку его последующими разработчиками.
 Именно поэтому я за автозагрузку. Наиболее прямой и простой метод без дублирования. В данном случае автозагрузка дает простую иерархическую архитектуру модулей и единую точку подключения.

Цитата

Так же есть затруднение с переносимостью модулей (допустим модулей). При архитектруе фасад и фабрики мы могли бы модуль полностью сделать автономным, при "доверении" подключаемых файлов в __autoload мы лишаемся, некторой части автономности, а детальней при переносе в другой проект он уже потребует сторонних включений своих!!! же файлов, то есть мы перенесём знания структуры модуля во внешнюю структуру ... судите сами 
 Какой части автономности ты лишаешься?

Цитата

И ещё как должна знать, если она "хочет" быть инфраструктурой модуля и единственной знающей единицей о структуре..
 Ей знать не надо, она может просто нужное подключать и оно подключится. spl_autoload_register();

Цитата

то это в превую очередь исключение дублирующих include и require, а eже потом все остальное
 Именно. Эти данные уже есть в архитектуре приложения и при написании их в явном виде происходит дублирование.
Это то же самое, что применение {} скобок: синтаксический анализатор заставляет их использовать по традиции, хотя в явном виде они ему не нужны. И уж тем более не нужны разработчику, т.к. для него код в первую очередь размечен отступами, а не кодом.
PM MAIL   Вверх
krundetz
Дата 21.1.2012, 09:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вечный странник
***


Профиль
Группа: Завсегдатай
Сообщений: 1400
Регистрация: 14.6.2007
Где: НН(Сормово)

Репутация: 20
Всего: 69



Цитата(Sentox @  20.1.2012,  23:19 Найти цитируемый пост)
Исключение дублирующих include и require - это include_once и require_once (при чём на уровне пхп машины!) всё остальное не должно это надстраивать если это уже до нас сделали.

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


--------------------
!цензоры - Хранитель стратегической жидкости
Группа ТГВ
Группа Нижний Новгород
user posted image
PM MAIL   Вверх
ksnk
Дата 21.1.2012, 09:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Цитата(Sentox @  21.1.2012,  01:49 Найти цитируемый пост)
Всё же мой вопрос в силе? Я просто могу пример привести что при выходе "знаний" структуры наружу рушится целостность автономности.

Хотелось бы увидеть.


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Gold Dragon
Дата 21.1.2012, 09:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 10
Всего: 71



так.. Я совсем запутался в этих рассуждениях. Можно чуть ближе к "земле"? smile

допустим, у меня есть ядро. где-то там я делаю функция
Код

function __autoload($class_name) {
    @include_once _PATH . $class_name . '.php';
}


а вызов происходит примерно так
Код

$object = new ClassName();


Т.е. при появлении new произойдёт вызов функции __autoload в которую передастся переменная  ClassName(). Ну и соответственно в самой функции подключается файл  _PATH . $class_name . '.php'
Так?

я так понимаю, что основной спор возникает при условии что если кто-то в одном из подключаемых модулей пожелает также сделать свою такую же функцию? Так?

И ещё, что будет если в коде будут встречаться отдельно ?
include_once _PATH . $class_name . '.php';



--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
ksnk
Дата 21.1.2012, 09:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Цитата(Gold Dragon @  21.1.2012,  09:38 Найти цитируемый пост)
Так?

Так.
Цитата(Gold Dragon @  21.1.2012,  09:38 Найти цитируемый пост)
спор возникает при условии что если кто-то в одном из подключаемых модулей пожелает также сделать свою такую же функцию? Так?

Так. Для того, чтобы иметь таки возможность вставить в свой модуль свой автолод  php.net рекомендует использовать spl_autoload_register - более гибкий аналог .
Цитата(Gold Dragon @  21.1.2012,  09:38 Найти цитируемый пост)
И ещё, что будет если в коде будут встречаться отдельно ?
include_once _PATH . $class_name . '.php';

Ничего плохого. Если инклуд встетился ДО использования класса - автолод не будет вызван для загрузки этого класса, причем, если класс и не пригодится для работы приложения - он все равно окажется описан. Если после - еще раз тикнет процедура проверки include_once. 

Просто с автолодом можно вообще НИГДЕ не использовать инклуды.


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Gold Dragon
Дата 21.1.2012, 10:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 10
Всего: 71



тогда дальше.. Из мануала я так толком и не понял как воспользоваться spl_autoload_register и как он вообще функционирует.. Поясните на простом примере.

и Второе, если встретится два spl_autoload_register что произойдёт и какой будет исполнен? или такого не может (не должно) быть?


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
ksnk
Дата 21.1.2012, 10:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Цитата(Gold Dragon @  21.1.2012,  10:17 Найти цитируемый пост)
 Из мануала я так толком и не понял как воспользоваться spl_autoload_register и как он вообще функционирует.. Поясните на простом примере.


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


Цитата(Gold Dragon @  21.1.2012,  10:17 Найти цитируемый пост)
если встретится два spl_autoload_register что произойдёт и какой будет исполнен? или такого не может (не должно) быть? 

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


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Gold Dragon
Дата 21.1.2012, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 10
Всего: 71



Цитата(ksnk @  21.1.2012,  11:33 Найти цитируемый пост)
Нужно написать функцию, которая выглядит и работает как __autoloaad, но называется по другому. и вызвать spl_autoload_register с параметром - именем этой функции. 


то есть так?
Код

function spl_autoload_register($class_name) {
    @include_once _PATH . $class_name . '.php';
}

а подключать так?
Код

$object = new ClassName();

или как-то по другому?
Код

spl_autoload_register('ClassName');




Это сообщение отредактировал(а) Gold Dragon - 21.1.2012, 11:42


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
ksnk
Дата 21.1.2012, 12:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



http://ru.php.net/manual/ru/function.spl-a...ad-register.php
там дофига примеров. Что конкретно не понятно?
http://ru.php.net/manual/ru/function.spl-a...ister.php#95456
Вот наиболее простой пример, а все остальные рассказывают чем этот способ лучше простого автолода 


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Gold Dragon
Дата 21.1.2012, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 10
Всего: 71



ksnk, напиши пожалуйста пример на основе моего (самый верхний пост на этой странице ;) никак не могу ухватить суть с этими параметрами...


Это сообщение отредактировал(а) Gold Dragon - 21.1.2012, 14:00


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
ksnk
Дата 21.1.2012, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Код

function My_autoload($class_name) {
    @include_once _PATH . $class_name . '.php';
}
...
spl_autoload_register('My_autoload');


а вызов происходит примерно так
Код

$object = new ClassName();



--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Gold Dragon
Дата 21.1.2012, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 10
Всего: 71



ВСЁ!!! теперь понял smile
Ну я примерно так и думал, что нужно через spl_autoload_register инициализировать функцию которая будет обрабатывать подключение. А дальше при new всё будет происходить автоматом

тогда ещё один вопрос. Что будет при: 
Код

ClassName::myMethod();
?

Добавлено через 2 минуты и 17 секунд
и ещё. Из мануала пример, но не смог правильно перевести с инглиш
Код

function a ($c) {
  echo "a\n";
  class Bla {} // Usually "include 'path/to/file.php';"
}
function b ($c) {
  echo "b\n";
}
spl_autoload_register('a');
spl_autoload_register('b');

$c = new Bla();

Что произойдёт и что будет вызиваться?


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
ksnk
Дата 21.1.2012, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Код

function a ($c) {
  echo "a\n";
  eval('class Bla { function test(){echo "it\'s Bla::test\n";}}');
}
function b ($c) {
  echo "b\n";
}

spl_autoload_register('b');
spl_autoload_register('a');
$c = new Bla();
$c->test();

выведет. 
Цитата

b
a
it's Bla::test



--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Gold Dragon
Дата 21.1.2012, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 10
Всего: 71



а про ещё один вопрос
Код

ClassName::myMethod();


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

 $object = new ClassName();

?


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
ksnk
Дата 21.1.2012, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



да, работает
Код

function a ($c) {
  echo "a\n";
  eval('class Bla { static function test(){echo "it\'s Bla::test\n";}}');
}
function b ($c) {
  echo "b\n";
}

spl_autoload_register('b');
spl_autoload_register('a');
Bla::test();



--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Gold Dragon
Дата 21.1.2012, 16:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 10
Всего: 71



ksnk, огромное спасибо за человеческие объяснения ;)

В общем теперь всё понятно что и как. Ну и соответственно понятно что лучше использовать в своих проектах


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
MoLeX
Дата 22.1.2012, 18:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Местный пингвин
****


Профиль
Группа: Модератор
Сообщений: 4076
Регистрация: 17.5.2007

Репутация: 46
Всего: 140



Gold Dragon, интересная статьтя http://habrahabr.ru/blogs/php/136761/


--------------------
Amazing  smile 
PM MAIL WWW ICQ   Вверх
Gold Dragon
Дата 22.1.2012, 20:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 10
Всего: 71



MoLeX, спасибо. отличная статья для понимая ;)


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
Страницы: (3) [Все] 1 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1040 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.