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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> __autoload: плюсы и минусы 
V
    Опции темы
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.0634 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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