找不到带有 PHP 命名空间的类

新手上路,请多包涵

我之前发布了一些关于在 PHP 中使用命名空间的问题,从我得到的信息来看,我下面的这个示例代码应该可以工作。

但是,当我尝试像这样在 PHP 中使用命名空间时出现错误。这是按原样运行以下代码时的第一个错误…

 Fatal error: Class 'Controller' not found in E:\Controllers\testing.php on line 6

E:\Controller\testing.php 文件

<?php
use \Controller;

include('testcontroller.php');

$controller = new Controller;
$controller->show();
?>

E:\Controller\testcontroller.php 文件

<?php
use \Library\Registry;

namespace Controller
{
    class Controller
    {
        public $registry;

        function __construct()
        {
            include('E:\Library\Registry.class.php');
            $this->registry = new Registry;
        }

        function show()
        {
            echo $this->registry;
            echo '<br>Registry was ran inside testcontroller.php<br>';
        }
    }
}
?>

E:\Library\Registry.class.php 文件

<?php
namespace Library\Registry
{
    class Registry
    {
        function __construct()
        {
            return 'Registry.class.php Constructor was ran';
        }
    }
}
?>

正如你所看到的,我试图让它尽可能简单,只是为了让命名空间部分正常工作。我尝试了不同的变体,但似乎无法弄清楚。

原文由 JasonDavis 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 945
2 个回答

即使使用 use 语句,您也需要指定您尝试实例化的类的命名空间。这里有很多例子: http ://www.php.net/manual/en/language.namespaces.importing.php

为了更好地理解它,我将向您描述它是如何工作的。在您的情况下,当您执行 use \Controller 时,整个 Controller 命名空间对您可用,但此命名空间中的类不可用。因此,例如:

 <?php
include('testcontroller.php');

use \Controller;

// Desired class is in namespace!
$controller = new Controller\Controller();

// Error, because in current scope there is no such class
$controller = new Controller();

$controller->show();
?>

另一个例子:

测试控制器.php:

 <?php
namespace Some\Path\To\Controller;

class Controller
{
    function __construct()
    {

    }

    function show()
    {
        echo '<br>Was run inside testcontroller.php<br>';
    }
}
?>

测试.php:

 <?php
include('testcontroller.php');

use \Some\Path\To\Controller;

// We now can access Controller using only Controller namespace,
// not Some\Path\To\Controller
$controller = new Controller\Controller();

// Error, because, again, in current scope there is no such class
$controller = new Controller();

$controller->show();
?>

如果您希望准确导入 Controller ,您需要执行 use Controller\Controller - 那么这个类将可以在您当前的范围内访问。

原文由 Timur 发布,翻译遵循 CC BY-SA 3.0 许可协议

命名命名空间(如类)并不是一个好主意,因为它令人困惑(我认为这就是这里发生的事情)。此刻,您通过 use Controller 定义别名,这引用了一个类 \Controller 或命名空间 \Controller ,但是您的类,因为它在命名空间内被命名为 \Controller\Controller 1

 use Controller;
$class = new Controller\Controller;

或者

$class = new \Controller\Controller;

或者

use Controller\Controller;
$class = new Controller;

这个想法是,当您尝试使用其相对名称访问一个类时,它会尝试将“第一部分”映射到使用 use 定义的任何别名(请记住 use MyClass 是相同的如 use MyClass as MyClass 。 --- as --- 之后的东西是别名)。

 namespace MyNamespace\MyPackage\SomeComponent\And\So\On {
  class MyClass {}
}
namespace Another {
  use MyNamespace\MyPackage\SomeComponent; // as SomeComponent
  $class =              new SomeComponent\An\So\On\MyClass;
}

如您所见,PHP 发现 SomeComponent 作为第一部分并将其映射到 SomeComponent -alias 以上行。

您可以在 有关命名空间的手册 中了解更多信息。

1 如果您使用其完整名称命名一个类,则它称为“完全限定的类名”。

原文由 KingCrunch 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题