Как вызвать __autoload() в php-коде

Я новичок в php и хочу использовать функциональность __autoload php5 в своем коде. Я написал ниже код в своем index.php, но я не понимаю, как и когда я должен вызывать функцию __autoload.

function __autoload($class) {
    if (file_exists($class . '.php')) {
        include($class . '.php');
    } else {
        throw new Exception('Unable to load class named $class');
    }
}

Я также видел этот поток, но в моем приложении нет такого класса автозагрузчика. Нужен ли каждому приложению отдельный класс для использования автозагрузки? Если нет, могу ли я иметь одну функцию, как указано выше, и выполнить ее задачу? Может ли кто-нибудь объяснить, как вызвать вышеуказанную функцию __autoload внутри моего php-кода?


person pabz    schedule 03.10.2012    source источник
comment
github.com/php-fig/fig- стандарты/blob/master/accepted/PSR-0.md   -  person Petah    schedule 03.10.2012


Ответы (5)


Вы не вызываете __autoload() сами, это делает PHP, когда пытается найти реализацию класса.

Например...

function __autoload($className) {
     include $className . '.php';
}

$customClass = new CustomClass;

... это вызовет __autoload(), передав CustomClass в качестве аргумента. Эта (глупая, например) реализация __autoload() затем попытается включить файл, прикрепив расширение php в конце.

Кроме того, вместо этого вы должны использовать spl_autoload_register(). Затем у вас может быть несколько реализаций, что полезно при использовании нескольких библиотек с автозагрузчиками.

... использование __autoload() не рекомендуется и может быть объявлено устаревшим или удалено в будущем.

Источник.

person alex    schedule 03.10.2012
comment
__autoload() УСТАРЕЛО, начиная с PHP 7.2.0. источник - person Raghavendra N; 23.03.2017
comment
@RaghavendraN Да, spl_autoload_register() лучше. См. последний абзац. - person alex; 23.03.2017

В PHP __autoload() является волшебным методом, то есть он вызывается автоматически, когда вы пытаетесь создать объект класса, и если движок PHP не находит класс в скрипте, он попытается вызвать волшебный метод __autoload().

Вы можете реализовать его, как показано ниже:

function __autoload($ClassName)
{
    include($ClassName.".php");
}

$CustomClassObj = new CustomClass();
$CustomClassObj1 = new CustomClass1();
$CustomClassObj2 = new CustomClass2();

Он автоматически включает все файлы классов при создании нового объекта.

P.S. Чтобы это работало, вам нужно указать имя файла класса, такое же, как имя класса.

person Mohit Mehta    schedule 03.10.2012

Вам, ребята, нужно использовать require_once вместо include, что съест вашу память. Лучший способ:

function __autoload($class) {
   $class_name = strtolower($class);
   $path       = "{$class}.php";
   if (file_exists($path)) {
       require_once($path);
   } else {
       die("The file {$class}.php could not be found!");
   }
}
person Hassan Azimi    schedule 14.12.2014
comment
Из любопытства, почему вы получаете строчную версию имени класса, а затем не используете ее? Вы намеревались проверить оба пути? - person Jesse Chisholm; 03.07.2015
comment
потому что это мешает вам создать cLaSS_nAme.php файл :) - person Hassan Azimi; 15.03.2016
comment
На самом деле, если бы вы сказали $path = "${class_name}.php";, я бы согласился. Я спросил, поскольку вместо этого вы используете "${class}.php", что позволяет использовать имя файла в странном регистре. - person Jesse Chisholm; 18.03.2016

также вы можете использовать spl_autoload_register() для загрузки файла php, и это намного лучше, чем __autoload, например:

<?php 
spl_autoload_register('myautoloadClass::myautoloadMethod');

class myautoloadClass{

   public static function myautoloadMethod(){
   require_once 'yourPath/'.'yourphpFile'.'.php';
   }

}

$obj = new xp; 


?>
person PHMJ    schedule 08.07.2018

Не используйте __autoload() вместо этого используйте spl_autoload_register. см. руководство по php, в котором говорится

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

    <?php

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

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

    spl_autoload_register('my_autoloader');

    // Or, using an anonymous function as of PHP 5.3.0
    spl_autoload_register(function ($class) {
        include 'classes/' . $class . '.class.php';
    });

    ?>
person RN Kushwaha    schedule 14.02.2015
comment
Я думаю, что слово «гибкий» означает, что вы можете использовать свою собственную реализованную функцию в качестве автозагрузчика. - person Amir Fo; 09.11.2018