命名空间内的必需类无法实例化

时间:2014-12-27 17:31:51

标签: php class namespaces include loader

好的,我制作了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();

$oControllerclassLoader()的实例吗?现在我从名称空间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

1 个答案:

答案 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来处理您的类自动加载。然后,命名空间主要成为文件系统布局的问题,并自动处理文件包含。