代码之家  ›  专栏  ›  技术社区  ›  kagali-san

PHP全局、嵌套/继承的自动加载

  •  1
  • kagali-san  · 技术社区  · 15 年前

    PHP 5.3.3-pl1-gentoo(cli)(构建时间:8月 2010年17日18:37:41)

    大家好,我在项目的主文件(index.php)中使用了一个简单的自动加载程序:

    require_once("./config.php");
    require_once("./app.php");
    require_once("./../shared/SqlTool.php");
    
    function __autoload($className) {
        $fn = 'file-not-exists-for-{$className}';
        if (file_exists("./specific/php/{$className}.php")) { $fn = "./specific/php/{$className}.php"; } else
         { $fn = "./../shared/{$className}.php";}
        require_once($fn);
    }
    
    $sql = new SqlHD(); // class SqlHD, in ./specific/php/SqlHD.php extends SqlTool
    $web = new HTMLForm($sql); // class HTMLForm in HTMLForm.php
    $app = new App($sql, $web); // class App in App.php
    $app->Main();
    

    问题是:没有这个 require_once("./../shared/SqlTool.php"); ,脚本无法执行SqlHD.php,因为它本身找不到SqlTool.php,并且由于某些原因,它没有使用在主文件中定义的自动加载例程。

    我试过这个:

    spl_autoload_register(__NAMESPACE__ .'\Test::load');
    
    class Test {
        static public function load($className){
            $fn = 'file-not-exists-for-{$className}';
            if (file_exists("./specific/php/{$className}.php")) { $fn = "./specific/php/{$className}.php"; } else
             { $fn = "./../shared/{$className}.php}";}
            echo realpath($fn);//"$curRealDir Filename $fn\n";
            echo "\n";
            require_once($fn);
        }   
    }
    

    PHP警告: 无法打开流:没有这样的文件或 目录 第20行PHP致命错误: require_once():打开失败 必需的“./../shared/SqlTool.php}” 在里面 /主页/beep/work/php/hauthd/index.php 在线20

    所以它不会对来自扩展类的任何请求做出反应。

    最后一个想法:将spl_autoload_register放入每个文件。但不能把它放在“扩展”指令本身!

    2 回复  |  直到 14 年前
        1
  •  2
  •   MrWhite    15 年前

    如果SqlHD扩展了SqlTool,那么您的u autoload()函数应该包括 .

    注意,您的文件名中有一个额外的“}”,这可能会弄乱这一点。(也可以将“n”粘贴到第二个代码段中。)

    { $fn = "./../shared/{$className}.php}";}
    

    require() 在你的函数中,而不是 require_once() ,因为您的uu autoload()函数只有在尚未加载时才被调用。

        2
  •  1
  •   Tim Fountain    15 年前

    [编辑:删除了错误的相对路径建议-w3d发现了真正的问题。把剩下的留在这里只是为了提供信息]

    require_once 在自动加载功能中 require

    通过使用include路径,可以大大简化自动加载,因为PHP会为您检查不同的位置。E、 g.像这样的:

    set_include_path(
        realpath('./specific/php') . PATH_SEPARATOR .
        realpath('./../shared') . PATH_SEPARATOR .
        get_include_path()
    );
    
    function __autoload($className) {
        require "$className.php";
    }
    
    推荐文章