【问题标题】:required class inside namespace cannot instantiate命名空间内的必需类无法实例化
【发布时间】:2015-02-24 12:12:39
【问题描述】:

好的,我制作了 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() 的实例,对吗?现在我从命名空间namespaceName 中的类classLoader() 中调用函数executeFunctionOutsideTheNamespace 并告诉include("class.php"); 并实例化扩展类女巫是classBase fromNamespace 的一个本质。我回复Fatal error: Class 'namespaceName\classExtended' not found in C:\xampp\htdocs\exercices\namespace.php on line 10

【问题讨论】:

  • 对 - 文件 class.php 没有声明命名空间,因此在全局命名空间中也是如此。它不会继承包含它的文件的命名空间,因此您需要使用new \classExtended()。这是你的问题吗?
  • 是的,我的类在globalNamespace\classExtended() 中,我的命名空间是namespaceName,所以我希望扩展namespaceName\classBase 的类也在namespaceName 中而不是在@ 之外987654344@ 我的问题是我如何在namespaceName 中包含扩展类?
  • 您需要将它放在namespaceName 中,并在其文件顶部声明namespace namespaceName; 我将在下面写这个作为答案。
  • 好的,我需要像这样扩展全局命名空间class classExtended extends \namespaceName\classBase
  • 或者在扩展时只保留命名空间,如下所示。由于它们已经在同一个命名空间中,因此您无需为其添加前缀。

标签: php class namespaces include loader


【解决方案1】:

class.phpclassLoader 类中的 include()ed,该类位于 namespaceName 命名空间内不会导致它从包含文件继承命名空间

因此,包含class.php 会将类classExtended 加载到全局命名空间中,这意味着要按代码访问它,您需要使用

new \classExtended("cool");

为了将classExtended 放入命名空间namespaceName,因为它驻留在自己的文件中,您需要在该文件中声明命名空间。这样做也意味着您需要从extends 声明中删除namespaceName,以免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 Interoperability Group 定义的PSR-4 class autoloading standard,并使用Composer 来处理您的类自动加载。然后命名空间主要成为文件系统布局的问题,并且文件包含被自动处理。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-12
    • 1970-01-01
    • 1970-01-01
    • 2017-05-02
    • 2015-07-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多