【发布时间】:2015-09-30 12:05:18
【问题描述】:
美好的一天。我正在研究一个示例,以准确了解名称空间是什么,以及它们的限制是什么。 我有这个结构(windows):
D:\server\sistemas\tests\phpNS\exec.php
D:\server\sistemas\tests\phpNS\Extra\Call.php
D:\server\sistemas\tests\phpNS\Extra\exec.php -->(另一个副本)
D:\server\sistemas\tests\phpNS\Lib\Base.php
每一个的代码:
exec.php
<?php
spl_autoload_register();
$a = new Extra\Call();
?>
调用.php
<?php
namespace Extra{
spl_autoload_register();
class Call{
public function __construct(){
$inst = new \Libs\Base();
var_dump($inst);
}
}
}
?>
Base.php
<?php
namespace Libs{
class Base{
public $dac;
public $doc;
public function __construct(){
}
}
}
?>
如果我在这种情况下工作,一切都很好。问题是当我执行 Extra\exec.php
额外\exec.php
<?php
namespace Extra{
spl_autoload_register();
$a = new Call();
}
?>
假定此文件的文件系统上下文是 Extra,这就是我使用该命名空间但无法正常工作的原因。我收到了这个错误。
致命错误:spl_autoload(): Class Extra\Call 无法在第 5 行的 D:\server\sistemas\tests\phpNS\Extra\exec.php 中加载
然后我记得 php 类是由尾部反斜杠 (\Iterator) 调用的,所以我也尝试了这个:
额外\exec.php
<?php
spl_autoload_register();
$a = new \Extra\Call();
?>
但我得到了相同的结果...我做错了什么,如果我想在这个或任何 n 深度目录中使用这个文件该怎么办?
【问题讨论】:
-
使用
autoloader components之一对您有帮助吗?例如The PSR-4 Class Loader。另外:Aura.Autoload : Provides a full PSR-4 and limited PSR-0 autoloader。两者都简化了类的autoloading的管理。我都使用过,目前正在使用Aura。 -
嗯,它似乎可以工作。但这意味着我需要使用 symfony 才能做到这一点?我只是确保我可以在任何 n 深度目录级别使用命名空间,因为如果我需要使用空白 index.php 中的 htaccess rewriterules 功能,并且遇到这个问题,我无法将文件重定向到项目结构,不会出现未加载类错误。
-
对不起瑞恩,也许我做错了什么。我已经在 exec.php 上重写了我的代码(这个很好) $dir = _ DIR _."/Libs/Aura.Autoload-2.x/src/Loader.php";需要一次($dir); $loader = 新 \Aura\Autoload\Loader; $loader->register(); $loader->addPrefix('Extra\Call', '\Extra\Call.php'); $a = new Extra\Call();我按照说明进行操作,并且正在加载 Aura,或者至少,我认为正在加载,但没有加载我的课程。你能帮我解决这个问题吗?
-
Zipped Source code for a working
Aura autoloaderon windows。下载并解压到任意目录。您需要更改的唯一文件是:根目录中的__bootstrap__.php。您需要将APP_ROOT_DIR定义更改为该目录所在的路径。然后test_loader*.php文件应该开始加载classes目录中的类。如果需要,我稍后会提供完整的解释。这些文件的评论相当不错。也许? -
+1 非常感谢 Ryan 付出的努力和时间,我非常感谢。我会检查它,只要我可以离开办公室。目前我看到了一些代码,看起来不错。我稍后会发给你。再次感谢 =)
标签: php namespaces