首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >命名空间的自动标注

命名空间的自动标注
EN

Stack Overflow用户
提问于 2017-12-28 15:57:08
回答 2查看 33关注 0票数 0

我的结构:

代码语言:javascript
复制
/test/init.php
/test/sub/Info.php

init.php:

代码语言:javascript
复制
<?php

namespace test;

$namespaces = function($path) {
    //echo $path; = test\sub\Info
    if (preg_match('/\\\\/', $path)) {
        $path = str_replace('\\', DIRECTORY_SEPARATOR, $path);
    }
    //echo $path; = test\sub\Info
    if (file_exists("{$path}.php")) {
        require_once("{$path}.php");
    }
};

spl_autoload_register($namespaces);

$info = new sub\Info();

和Info.php:

代码语言:javascript
复制
<?php

namespace test\sub;

class Info
{
    public function __construct()
    {
        echo 123;
    }
}

为什么这不管用?

我使用Windows,那么为什么使用DIRECTORY_SEPARATOR == \?

编辑:对不起,我更新了我的问题。我忘了在堆栈溢出上粘贴spl_autoload_register。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-12-28 16:35:31

你用的是相对路径,所以有几件事可能是错误的.通过执行以下操作,可以看到哪个是当前的工作目录:

代码语言:javascript
复制
echo getcwd();

你也可以尝试这样的方法:

代码语言:javascript
复制
$namespaces = function($class) {
    $basepath = __DIR__ . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR;
    $file = $basepath . str_replace('\\', DIRECTORY_SEPARATOR, $class) . ".php";

    if (!file_exists($file) || !is_readable($file)) {
        return false;
    }

    require_once($file);

    return class_exists($class, false);
};

变量$basepath也可以是定义的常量,也可以是配置文件中的变量.

票数 0
EN

Stack Overflow用户

发布于 2017-12-28 16:27:09

理想情况下,您的自动加载程序需要在名称空间之外,在目录结构的顶层定义--就目前设置它的方式而言,它试图从测试目录中而不是从根(即不存在的test/test/sub/Info.php )中包含文件test/test/sub/Info.php

如果您从两个文件中删除名称空间前缀test (因此从init.php中完全删除它,并在sub/Info.php中只有namespace sub; ),那么它将正确工作。另一种选择是将自动加载程序移动到根目录中的文件中,以便名称空间与文件系统布局再次匹配。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48010522

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档