require_once:打开流失败

时间:2019-03-05 19:47:13

标签: php namespaces

我读了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`.

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

2 个答案:

答案 0 :(得分:0)

在单独的文件中创建自动装带器类:

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');

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

require_once '/PATH_TO/autoload.php';

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

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

答案 1 :(得分:0)

之所以失败,是因为相对于您所需要的来源,类的路径是错误的。试试:

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;
});