13

我是 php 新手,我想在我的代码中使用 php5 的 __autoload 功能。我在 index.php 中编写了以下代码,但我不明白应该如何以及何时调用 __autoload 函数。

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

我也看过这个线程,但我的应用程序中没有这样的自动加载器类。每个应用程序都需要一个单独的类来使用自动加载吗?如果没有,我可以拥有像上面这样的单一功能并完成它的任务吗?谁能解释如何在我的 php 代码中调用上述 __autoload 函数?

4

5 回答 5

18

您不会调用__autoload()自己,PHP 在尝试查找类的实现时会调用。

例如...

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

$customClass = new CustomClass;

...这将调用,作为参数__autoload()传递。CustomClass然后,此(例如愚蠢的)__autoload()实现将尝试通过php在末尾添加扩展名来包含文件。

顺便说一句,您应该spl_autoload_register()改用。然后,您可以拥有多个实现,这在将多个库与自动加载器一起使用时很有用。

...__autoload()不鼓励使用,将来可能会被弃用或删除。

来源

于 2012-10-03T05:48:02.000 回答
9

在 PHP 中 __autoload() 是一个魔术方法,这意味着当您尝试创建类的对象时它会自动调用,如果 PHP 引擎在脚本中找不到该类,它将尝试调用 __autoload() 魔术方法。

您可以按照以下示例实现它:

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

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

创建新对象时,它将自动包含所有类文件。

PS为此,您必须提供与类名相同的类文件名。

于 2012-10-03T13:39:15.883 回答
3

你们需要使用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!");
   }
}
于 2014-12-14T17:51:46.473 回答
1

您也可以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; 


?>
于 2018-07-08T09:33:10.037 回答
0

不要使用 __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';
    });

    ?>
于 2015-02-14T04:58:34.847 回答