【问题标题】:require_once : failed to open streamrequire_once : 无法打开流
【发布时间】:2019-03-05 19:47:13
【问题描述】:

我阅读了 SO 并尝试了一些答案,但我的代码不起作用: 我有两个班:C:\Apache24\htdocs\phpdb\classes\dbconnection\mysqlconnection\MySqlConnection.phpC:\Apache24\htdocs\phpdb\classes\utilities\mysqlutilities\CreateTableDemo.php。 在 CreateTableDemo 我有以下代码:

    namespace utilities\mysqlutilities;
    use dbconnection\mysqlconnection\MySqlConnection as MSC;
    spl_autoload_register(function($class){
        $class = 'classes\\'.$class.'.php';
        require_once "$class";
    });

我收到以下警告:

`Warning: require_once(classes\dbconnection\mysqlconnection\MySqlConnection.php): failed to open stream: No such file or directory in C:\Apache24\htdocs\phpdb\classes\utilities\mysqlutilities\CreateTableDemo.php on line 10`.

我理解警告,脚本在同一文件夹中找不到命名空间类,所以我更改了spl_autoload_register 以查找相对路径:__DIR__."\\..\\..\\classes\\.$class.'.php'。我明白了

warning: `Warning: require_once(C:\Apache24\htdocs\phpdb\classes\utilities\mysqlutilities\..\..\classes\dbconnection\mysqlconnection\MySqlConnection.php): failed to open stream: No such file or directory in C:\Apache24\htdocs\phpdb\classes\utilities\mysqlutilities\CreateTableDemo.php on line 10`.

我找不到将脚本定向到命名空间类的方法。 提前感谢您的帮助。

【问题讨论】:

    标签: php namespaces


    【解决方案1】:

    在单独的文件中创建一个自动加载器类:

    class Autoloader {
        static public function loader($path) {
            $filename = __DIR__.'/classes/'.str_replace("\\", '/', $path).".php";
    
            if (file_exists($filename)) {
                include($filename);
                $aClass = explode('\\', $path);
                $className = array_pop($aClass);           
                if (class_exists($className)) {
                    return TRUE;
                }
            }
            return FALSE;
        }
    }
    spl_autoload_register('Autoloader::loader');
    

    并将其包含在您的索引文件(或其他文件)中。 它将加载位于文件夹“类”中的所有命名空间类。

    require_once '/PATH_TO/autoload.php';
    

    顺便说一句:诀窍是将反斜杠替换为常规斜杠。 对我来说很好。

    编辑:将 autoloader.php 放置在与“classes”文件夹相同的级别。 :-)

    【讨论】:

    • 它有效,谢谢。是否需要通过自动加载器才能使其工作?
    • 很高兴听到这个消息 :-) 不,这不是必需的,但我喜欢它,因为它是加载所需文件的一种干净而优雅的方式。
    【解决方案2】:

    它失败了,因为该类的路径相对于您需要的位置是错误的。试试:

    namespace utilities\mysqlutilities;
    use dbconnection\mysqlconnection\MySqlConnection as MSC;
    spl_autoload_register(function($class){
        $exp = explode('classes', __DIR__);
        $base = reset($exp);
        $class = $base."classes".DIRECTORY_SEPARATOR.$class.".php";
        require_once $class;
    });
    

    【讨论】:

    • $base = reset(explode('classes', __DIR__)); 我在该行遇到错误。只有变量应该通过引用传递
    猜你喜欢
    • 2015-03-22
    • 2019-09-17
    • 1970-01-01
    • 1970-01-01
    • 2010-11-14
    • 1970-01-01
    • 2017-09-14
    • 2015-01-01
    • 2011-01-01
    相关资源
    最近更新 更多