__autoload

 
0
 
PHP
ava
superphp | 20.03.2013, 17:05
Хочу загрузить автоматически 2 класса, используя функцию автолоад, не грузятся чего-то.
Все 3 файла: index.php, A.php, B.php находятся в одной папке www

Вот файл index.php


<?php
function __autoload($name_class){
    echo $name_class.'.php';
}

$obj = new A();
$obj = new B();
?> 



Файл A.php


<?php
class A{
public    function hi(){
        echo 'Hello file 1.php';
    }
}
?> 



Файл B.php


<?php
class B{
public    function hi(){
        echo 'Hello file 2.php';
    }
}
?> 



Ошибка: 
A.php
Fatal error: Class 'A' not found in D:\server\super-php\test.ru\www\index.php on line 6
Comments (15)
ava
baldina | 20.03.2013, 16:18 #
__autoload() не эхать должна, а предпринимать действия, что бы класс стал доступен (подключать соотв. файл)


function __autoload($name_class){
    require_once($name_class.'.php');
}


кстати,
Цитата


spl_autoload_register() предоставляет более гибкую альтернативу для автоматической загрузки классов. По этой причине использовать __autoload() не рекомендуется, а сама функция в будущем может перестать поддерживаться или быть удалена.

ava
Арантир | 20.03.2013, 16:21 #
 smile 
Оно не так работает...

Пример на вид прямо как с php.net, но с фатальной ошибкой. http://www.php.net/manual/en/language.oop5.autoload.php

Внутри функции должен производиться include файла с классом, а не вывод имени класса.
ava
Sanchezzz | 20.03.2013, 16:21 #
Путь нужно указывать, да и инклуд в функции нужно сделать


function my_autoloader($class) {
    include 'classes/' . $class . '.class.php';
}

spl_autoload_register('my_autoloader');

// начиная с версии PHP 5.3.0 можно использовать безымянные функции
spl_autoload_register(function ($class) {
    include 'classes/' . $class . '.class.php';
});




PS пользуйтесь spl_autoload_register за место созданием функции __autoload
ava
Арантир | 20.03.2013, 16:21 #
baldina, опоздал =)

added later:
Sanchezzz, ох, как все набросились... Я даже не успел написать "опоздал", а уже новый пост...
ava
Sanchezzz | 20.03.2013, 16:23 #
Arantir, ага опоздали, у нас даже время одинаковое постинга.
ava
Aliance | 20.03.2013, 16:27 #
Интересно, если я сейчас напишу четвертый пост про include вместо echo - прокатит? smile
ava
Sanchezzz | 20.03.2013, 17:03 #
Не когда не узнаешь если сомневаешься, пока не попробуешь.  smile 
ava
Gold Dragon | 20.03.2013, 18:31 #
ну тогда и я предложу свой вариант  smile Только я ориентируюсь на spl_autoload_register

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

Подключение автозагрузчика классов
файл index.php

// Абсолютный путь до "корня" сайта
define('_PATH_ROOT', __DIR__);

try { // Инициализация основного ядра

    //..............

    require_once(_PATH_ROOT . '/core/autoloader.php');

    //..............

} catch (GDLException $e) { // Обработка исключений

    echo '<i>Ошибка:</i> '. $e->getMessage(). '<br>';
    echo '<i>Файл:</i> '. $e->getFile(). '<br>';
    echo '<i>Строка:</i> '. $e->getLine();
    echo '<pre>';
    print_r($e->getTraceAsString());
    echo '</pre>';
}


Сам обработчик
файл autoloader.php

spl_autoload_register(array('GDLAutoloader', 'Init'));

class GDLAutoloader
{
    /** @var array - массив с данными о классах */
    private static $file_parse = null;

    /**
     * Инициализация класса
     *
     * @param string $class_name - Имя файла класса
     *
     * @throws Exception
     */
    public static function Init($class_name = '')
    {
        // получаем данные по классам
        if (is_null(self::$file_parse)) {
            self::$file_parse = parse_ini_file(_PATH_ROOT . '/config/autoload.ini', true);
        }

        // Устанавливаем флаги ошибок
        $flag_file = null;
        $flag_group = null;
        $flag_class = null;
        $path = null;

        // прогоняем массив
        foreach (self::$file_parse as $file => $class) {
            $result = array_search($class_name, $class);
            
            // если класс найден
            if ($result !== false) {

                // вибирает группу класса и подключаем
                switch ($file) {

                    // файлы Ядра
                    case 'core':
                        $path = _PATH_ROOT . '/core/' . $result . '.php';
                        break;

                    // Библиотеки
                    case 'library':
                        $path = _PATH_ROOT . '/lib/' . $result . '/' . $result . '.php';
                        break;
                }
                if (!is_null($path)) {
                    if (file_exists($path)) {
                        require_once($path);
                        $flag_file = 1;
                    }
                    $flag_group = 1;
                }
                $flag_class = 1;
            }
        }
        if (is_null($flag_class)) {
            throw new Exception(sprintf(_EXP_CLASS_NOT_FOUND, $class_name));
        }
        if (is_null($flag_file)) {
            throw new Exception(sprintf(_EXP_FILE_CLASS_NOT_FOUND, $path, $class_name));
        }
        if (is_null($flag_group)) {
            throw new Exception(sprintf(_EXP_GROUP_CLASS_NOT_FOUND, $class_name));
        }
    }
}


Ну и файл конфигурации
файл autoload.ini

;=======================================
; Данные по существующим классам
;   [группа класса]
;       название файла = 'имя класса'
;=======================================

;---------------------------------------
; Ядро
;---------------------------------------
[core]

; Основное ядро
gdlotos = 'GDLotos'

; Конфигурация
config = 'GDLConfig'

; Управление пользователями
user = 'GDLUser'

; Управление базой данных
database = 'GDLDatabase'

; Управление сессиями
session = 'GDLSession'

; Управление шаблонами
template = 'GDLTemplate'

; Управление кэшем
cache = 'GDLCache'

; Управление ошибками
exception = 'GDLException'

;---------------------------------------
; Библиотеки
;---------------------------------------
[library]

; Работа с INI-файлами
ini = 'LibIni'

; Работа с языковыми файлами
lang = 'LibLang'





ava
baldina | 20.03.2013, 19:18 #
Gold Dragon, не возникало желания воспользоваться каким-нить готовым фреймворком?
ava
Gold Dragon | 20.03.2013, 19:45 #
а зачем? Хоть один плюс назови, кроме как не писать что-то самому... Нафига мне что-то непонятное и громоздкое, когда я для собственных целей просто написал себе простое решение.
baldina, с твоим подходом можно просто платить деньги и тебе всё будут делать.. да и программированием можно вообще не заниматься.
ava
baldina | 20.03.2013, 20:59 #
Цитата (Gold Dragon @  20.3.2013,  19:45 findReferencedText)
кроме как не писать что-то самому

этого недостаточно?

Цитата (Gold Dragon @  20.3.2013,  19:45 findReferencedText)
непонятное и громоздкое

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

Цитата (Gold Dragon @  20.3.2013,  19:45 findReferencedText)
можно просто платить деньги и тебе всё будут делать..

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


это все не для холивара, я просто хотел узнать почему

added later:
кстати, программисты без работы не остануться, т.к. частных задач всегда будет много.
ava
Gold Dragon | 20.03.2013, 21:22 #
baldina, ну на хлеб с икрой я другим зарабатываю бизнесом  smile А программирование это моё хобби.. Нравится мне сайты делать..
Цитата (baldina @  20.3.2013,  21:59 findReferencedText)
это пока не изучишь. а как изучишь, выяснится, что оно простое и понятное, и основано на тех же решениях, которые придумал ты. или на еще лучших решениях...
Согласен что есть решения, которые просто глупо переписывать.. С другой стороны (для меня), зачем мне фремворк, когда я сам движки пишу, в том числе и фреймворки  smile И нравится ломать то что есть и переписывать на свой лад..

Да и какой "большой" фреймворк не возьми, он "закостенел", т.е. если написан для старых версий PHP, а новые в лучшем случае только поддерживает.. То есть чем больше "монстр" тем он мене подвижен smile 

Цитата (baldina @  20.3.2013,  21:59 findReferencedText)
кстати, программисты без работы не останутся, т.к. частных задач всегда будет много.
спорно... сейчас школьники кинулись за копейкой, хотя сами ни бум-бум... А "современным" бизнесменам всё равно как главное дёшево.. Вот и на форуме всё чаще стали всплывать вопросы, которые порой просто в ступор в водят
ava
baldina | 20.03.2013, 22:04 #
Цитата (Gold Dragon @  20.3.2013,  21:22 findReferencedText)
сейчас школьники кинулись за копейкой

такая песня была и 10 и 20 и 30 лет назад. уровень входа в профессию понижается, это нормально.
профессионалы все равно будут востребованы.
попробуйте найдите хорошего свободного программиста на C++. или хотя бы php 
кстати, профессия в свою очередь усложняется.
ava
superphp | 20.03.2013, 22:06 #
А в чем разница от того кода, если писать так? Вот глянул в документации, только работает также, что просто __autoload что spl_autoload_register, а разница в чем такого хода?

<?php

// function __autoload($class) {
//     include 'classes/' . $class . '.class.php';
// }

function my_autoloader($class) {
    include 'classes/' . $class . '.class.php';
}

spl_autoload_register('my_autoloader');

// начиная с версии PHP 5.3.0 можно использовать безымянные функции
spl_autoload_register(function ($class) {
    include 'classes/' . $class . '.class.php';
});



$obj1 = new A();
$obj1->hi();
$obj2 = new B();
$obj2->hi();
?> 
ava
Sanchezzz | 20.03.2013, 22:29 #
Цитата


А в чем разница от того кода, если писать так? Вот глянул в документации, только работает также, что просто __autoload что spl_autoload_register, а разница в чем такого хода?



Цитата


Регистрирует функцию в spl стэке метода __autoload. В результате стэк будет активирован, даже если ранее он был выключен.



Если в вашем скрипте реализована функция __autoload(), ее необходимо явно зарегистрировать в стэке __autoload. Это необходимо, так как spl_autoload_register() полностью заменяет механизм кэширования __autoload() функциями spl_autoload() и spl_autoload_call().



spl_autoload_register() позволяет задать несколько реализаций метода автозагрузки описаний классов и интерфейсов. Она создает очередь из функций автозагрузки в порядке их определения в скрипте, тогда как встроенная функция __autoload() может иметь только одну реализацию.

Please register or login to write.
Firm of day
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Contributors
advanced
Submit