【问题标题】:Understanding php namespace and why the fatal error: undefined constant理解 php 命名空间以及为什么会出现致命错误:未定义的常量
【发布时间】:2017-11-12 18:52:15
【问题描述】:

试图了解 php 中的命名空间是如何工作的并且被卡住了。

下面是项目的架构。

类:Loader.php(假设加载控制器/模型/库,但现在乱码测试代码)

namespace system\core;

class Loader
{
    public function index()
    {
        echo 'loader';
    }

    public function controller($pathtocontroller)
    {
        // Echo path to the controller
        echo $pathtocontroller;

    }
}

index.php

require 'system/core/Loader.php';
require 'system/core/BaseController.php';
require 'app/controller/common/HomeController.php';

use system\core;
use app\controller;

$loader = new \system\core\Loader();
$loader->controller(app\controller\common\HomeController);

这是我得到的错误

致命错误:未定义的常量 'app\controller\common\HomeController' 在第 20 行的 C:\xampp\htdocs\psrstd\index.php 中。索引上的第 20 行是 $loader->controller(app\controller\common\HomeController);

预期结果: app/controller/common/HomeController

如果你想知道 HomeController 里面有什么(又是乱码测试代码)

namespace app\controller\common;
use system\core\BaseController;

class HomeController extends BaseController
{
    public function index()
    {
        echo 'home';
    }
}

【问题讨论】:

  • 你想达到什么目标?
  • @u_mulder,HomeController 位于 app/controller/common。我只是想回显控制器的路径。
  • 为什么需要控制器路径?
  • @u_mulder,像这样加载控制器 $this->load->controller('common/HomeController'); ..
  • @u_mulder,但那是后来... Loader.php 应该是一个类加载器。

标签: php namespaces


【解决方案1】:

您将一个常量类型传递给您的控制器方法,

您的目标是传递一个对象 [dependency injection],因此您需要实例化您的参数,例如:

$loader->controller(new \app\controller\common\HomeController);

否则,您可以将此参数作为字符串发送,例如:

$loader->controller("\\app\\controller\\common\\HomeController");

并在您的方法中实例化该对象 [as a factory method]

public function controller($pathtocontroller)
{
    // new $pathtocontroller and so on

}

进一步阅读:

What is Dependency Injection?

Factory design pattern

【讨论】:

  • 这行得通 $loader->controller("\\app\\controller\\common\\HomeController");",但看起来很难看。有没有更好的方法?
  • 长得丑是什么意思?
  • \\app\\controller\\common\\HomeControll‌​er .. 我需要 '\\' 吗?我以前做 $this->load->controller(common/HomeController) 的旧项目现在不得不这样做 $this->load->controller(common\\HomeController) 看起来很难看......我会做的如果没有其他办法,只能问...可以做得更好吗?。
  • 反斜杠是PHP中命名空间的前分隔符,你不能去掉它,因为反斜杠也是转义字符,所以你必须像这样转义`\`
猜你喜欢
  • 2013-06-12
  • 1970-01-01
  • 2017-10-09
  • 2013-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-15
相关资源
最近更新 更多