好的,我制作了3个文件index.php
,其中包含namespace.php
我有2个功能:
Namespace namespaceName{
class classLoader{
public function __construct() {
//not used
}
public function executeFunctionOutsideTheNamespace() {
include("class.php");
new classExtended("badass");
}
}
class classBase{
public function __construct(){
}
}
}
现在从index.php
我动态尝试从第三个文件class.php
调用一个函数,这是一个从namespaces
扩展一个类的类。这是class.php
代码
class classExtended extends namespaceName\classBase
{
public function __construct($action) {
echo $action;
}
}
当然还有我的index.php
档案
require("namespace.php");
$namespace= new namespaceName\classLoader();
$oController = $namespace->executeFunctionOutsideTheNamespace();
$oController
是classLoader()
的实例吗?现在我从名称空间executeFunctionOutsideTheNamespace
中调用类classLoader()
中的函数namespaceName
,然后告诉include("class.php");
并实例化扩展类女巫是来自Namespace的classBase的延伸。我记得Fatal error: Class 'namespaceName\classExtended' not found in C:\xampp\htdocs\exercices\namespace.php on line 10
答案 0 :(得分:2)
位于class.php
命名空间内的include()
类classLoader
namespaceName
内的事实不会导致它继承命名空间< / em>来自包含文件。
因此,包括class.php
将类classExtended
加载到全局命名空间中,意味着要按照您的代码访问它,您需要使用
new \classExtended("cool");
为了将classExtended
放入命名空间namespaceName
,由于它位于自己的文件中,因此您需要在该文件中声明命名空间。这样做还意味着您需要从namespaceName
声明中删除extends
,以免PHP开始寻找嵌套的namespaceName\namespaceName\classBase
。文件class.php
必须变为
namespace namespaceName;
// Declare the class without the namespace in extends
// since classExtended is now in the same namespace as classBase
class classExtended extends classBase
{
public function __construct($action) {
echo $action;
}
}
我强烈建议您熟悉PHP Framework互操作性组定义的PSR-4 class autoloading standard,并使用Composer来处理您的类自动加载。然后,命名空间主要成为文件系统布局的问题,并自动处理文件包含。