Jump to content
  • 0

Кто использует function __autoload?


rus
 Share

Question

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

Кто в своих проектах использует "ленивую загрузку" классов на лету?

Какие преимущества, или недостатки?

В каких проектах стоит использовать: больших, средних, маленьких?

Свои варианты, поделитесь, плиз (с комментами).

Link to comment
Share on other sites

15 answers to this question

Recommended Posts

  • 0

Ничего плохого в "ленивой автозагрузке" не будет.

Взгляните также на spl_autoload.

Если боитесь проблем с производительностью,

используйте eAccelerator -- он будет полезен, когда у Вас будет больше трехсот тысяч уникальных посетителей.

Link to comment
Share on other sites

  • 0

Взгляните также на spl_autoload.

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

Если боитесь проблем с производительностью,

используйте eAccelerator -- он будет полезен, когда у Вас будет больше трехсот тысяч уникальных посетителей.

а это мне пока не нужно и не интересует.

вопрос собственно в том, нормально ли использовать вместо инклуда и рекуайера эту функцию?

Link to comment
Share on other sites

  • 0

Вот как будет выглядеть Ваша функция __autoload():


function __autoload($className) {
require_once "$className.php";
}

В случае с spl_autoload() можно более гибко настроить расширения подключаемых файлов, например использовать .inc, .inc.php, .class.php и т.п.

Link to comment
Share on other sites

  • 0

Вот как будет выглядеть Ваша функция __autoload():


function __autoload($className) {
require_once "$className.php";
}

В случае с spl_autoload() можно более гибко настроить расширения подключаемых файлов, например использовать .inc, .inc.php, .class.php и т.п.

че, серьезно? а если сюда посмотреть?

в преддверии следующих вопросов типа: а зачем тогда создавал топик, отвечаю - у меня несколько другие вопросы.

Link to comment
Share on other sites

  • 0

Ну, во-первых, не надо кипятиться.

Во-вторых, в php есть директива include_path.

Не считаю правильным городить огород вокруг подключения классов.

Следует учесть, что include и require -- дорогие операции для php.

Можно было бы объединить все классы в один файл перед выкладкой проекта.

Во время разработки так делать, конечно, не следует.

Link to comment
Share on other sites

  • 0

Ну, во-первых, не надо кипятиться.

Во-вторых, в php есть директива include_path.

Не считаю правильным городить огород вокруг подключения классов.

Следует учесть, что include и require -- дорогие операции для php.

Можно было бы объединить все классы в один файл перед выкладкой проекта.

Во время разработки так делать, конечно, не следует.

да я не кипячусь, ваш пример конечно же верен, только он на столько приметив, что даже в качестве примера не очень подходит.

include_path - да, есть такая тема, а чем хуже-лучше например - функция realpath()?

насчет require к стати не согласен, он во-первых работает быстрее чем include, а во-вторых не так уж и грузит сервак (ну может быть исключение какой-нибудь проект с уникумами до 10k. в день).

Link to comment
Share on other sites

  • 0

Может быть тогда я смогу ответить на те вопросы, которые Вас интересуют?

Ну так да.

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

Может есть какие подводные камни?

Ну например стоит ли ее использовать если разные классы в разных директориях и поддиректориях?

Или же можно их по типу объединить и в одну директорию?

Стоит ли указать с каких конкретно директорий грузить классы, или дать возможность искать во всех?

Нагрузка - это само-собой, но на этот вопрос вы вроде как ответили.

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

UPD: при этом возникает еще такой вопрос: стоит ли перенаправлять все запросы на один файл index.php и как тогда после этого будет выглядеть чпу? Это тоже относится к данной функции.

Link to comment
Share on other sites

  • 0

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

Может есть какие подводные камни?

Попробуйте.

Пока никто не жаловался.

Ну например стоит ли ее использовать если разные классы в разных директориях и поддиректориях?

Или же можно их по типу объединить и в одну директорию?

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

Директории должны быть в include_path.

Стоит ли указать с каких конкретно директорий грузить классы, или дать возможность искать во всех?

Обычно все пути проекта добавляют в include_path.

Нагрузка - это само-собой, но на этот вопрос вы вроде как ответили.

Не берите пока в голову.

UPD: при этом возникает еще такой вопрос: стоит ли перенаправлять все запросы на один файл index.php и как тогда после этого будет выглядеть чпу? Это тоже относится к данной функции.

Так и делают.

index.php -- это точка входа для любого приложения.

Посмотрите, как это сделано во фреймворках на php.

Для ЧПУ используют mod_rewrite, с перенаправлением запроса на index.php.

Анализ строки запроса производят уже в приложении.

Link to comment
Share on other sites

  • 0

Ну например стоит ли ее использовать если разные классы в разных директориях и поддиректориях?

Или же можно их по типу объединить и в одну директорию?

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

Директории должны быть в include_path.

Стоит ли указать с каких конкретно директорий грузить классы, или дать возможность искать во всех?

Обычно все пути проекта добавляют в include_path.

Вот об этом можно немного подробнее?

Раз вы сами не хотите привести свой вариант, приведу его я (вариант не мой):


<?php
error_reporting (E_ALL);

if (version_compare(phpversion(), '5.1.0', '<') == true) { die ('PHP5.1 Only'); }


// Константы:

define ('DIRSEP', DIRECTORY_SEPARATOR);


// Узнаём путь до файлов сайта

$site_path = realpath(dirname(__FILE__) . DIRSEP . '..' . DIRSEP) . DIRSEP;

define ('site_path', $site_path);

// Загрузка классов «на лету»
function __autoload($class_name) {

$filename = strtolower($class_name) . '.php';

$file = site_path . 'classes' . DIRSEP . $filename;


if (file_exists($file) == false) {

return false;

}


include ($file);

}

?>

По данному примеру есть какие-либо недочеты?

В этом коде не указаны директории, а значит он будет искать во всех папках?

Нагрузка и время выполнения при этом сильно увеличатся?

Link to comment
Share on other sites

  • 0

"return false" - не требуется. Если класс не будет найден, на экране появится стойкий Fatal Error.

Лучше не использовать strtolower(), а именовать файлы в том же регистре, как и классы, например:

class Postgres {} -> Postgres.php

class Controller {} -> Controller.php

Про нагрузку не берите в голову.

  • Like 1
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy