了解php命名空间以及为什么致命错误:undefined constant

时间:2017-11-12 10:46:07

标签: php namespaces

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

以下是该项目的架构。

enter image description here

类: 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中。索引上的Lin 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';
    }
}

1 个答案:

答案 0 :(得分: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