在Linux上使用命名空间和目录自动加载类

时间:2018-05-01 04:30:30

标签: php class namespaces

嘿,我只是在学习名称空间和自动加载的工作原理。似乎无法让它工作可以使用一些帮助。我使用codeigniter,相关的目录结构如下:

root/
    application/
        classes/
            testa/
                TestClass.php
            testb/
                UserClass.php
    html/
        index.php

TestClass.php的内容是

namespace application\classes\testa;

class TestClass {
    public $var = 'a default value';
    public function displayVar() {
        echo $this->var;
    }
}

我尝试以这样的方式自动加载内容,它可以使用类文件夹里面的任何目录结构,比如index.php里面的内容(我在网上找到了这个代码)

// autoload classes based on a 1:1 mapping from namespace to directory 
// structure.
spl_autoload_register(function ($className) {
    # Usually I would just concatenate directly to $file variable 
    # below
    # this is just for easy viewing on Stack Overflow)

    $ds = DIRECTORY_SEPARATOR;
    $dir = __DIR__;

    // replace namespace separator with directory separator (prolly
    // not required)
    $className = str_replace('\\', $ds, $className);

    // get full name of file containing the required class
    $file = "{$dir}{$ds}{$className}.php";

    // get file if it is readable
    if (is_readable($file)) require_once $file;
});

但是当我尝试使用

在codeigniter视图中实例化一个类时
$obj = new application\classes\testa\TestClass();

我得到了

An uncaught Exception was encountered
Type: Error
Message: Class 'application\classes\testa\TestClass' not found

我做错了什么?我之前从未真正使用过命名空间或类,所以我有点迷失。我认为自动加载器写错了(可能是Windows机器?)但我不确定。谢谢你的帮助。

2 个答案:

答案 0 :(得分:1)

由于您在Windows机器上运行,我假设root位于C:

之下

在index.php中,$file = "{$dir}{$ds}{$className}.php";将是

  

C:\根\ HTML \应用\类\种皮\ TestClass.php

你在那里找不到你的TestClass.php。

正确的文件路径应为

$file = "{$dir}{$ds}..{$ds}{$className}.php";

将是

  

C:\根\ HTML \ .. \应用\类\种皮\ TestClass.php

..\表示父目录。

答案 1 :(得分:0)

感谢您的帮助。我设法搞清楚了。我选择了自动加载器,它为类dir提供了正确的路径

spl_autoload_register(function ($className) {
    // $ds = '/';
    $ds = DIRECTORY_SEPARATOR;
    // $dir = the path to this file (index.php), it always gives 
    // path to the current file
    $dir = __DIR__ ;
    // replace namespace separator with directory separator (prolly
    // not required)
    $className = str_replace('\\', $ds, $className);
    // get full name of file containing the required class 
    $file = '../' . $className . ".php";
    // get file if it is readable
    if (is_readable($file)) require_once $file;
});

BTW我在Linux上,而不是Windows