gpt4 book ai didi

php - 理解 PHP 命名空间的困惑

转载 作者:行者123 更新时间:2023-12-04 16:55:39 24 4
gpt4 key购买 nike

我正在学习和实现 PHP 命名空间。
请引用以下代码:

<?php

namespace Xicor\core;

class App {

public function __construct() {

$registry = Registry::getInstance();

//TODO: init router

//TODO: call controller@action
$controllerName = 'Xicor\app\controllers\\'.'Index';
$action = 'show';

$controller = new $controllerName();
$controller->$action();

}

}

上面的代码完美运行。

如果我添加 throw new Exception('Lorem Ipsum')在构造函数中,我会按预期收到错误。为了让它工作,我必须使用 throw new \Exception('Lorem Ipsum')所以我们指的是全局命名空间。

但是,为什么 $controllerName = 'Xicor\app\controllers\\'.'Index';成功导入正确的类。

为什么我不必使用 $controllerName = '\Xicor\app\controllers\\'.'Index'; (以\为前缀)?

如果它影响任何事情,这是我的自动加载器:

<?php

spl_autoload_register(function($name) {
//replace \ with DIRECTORY_SEPARATOR
$path = str_replace('\\', DS, $name);
//replace Xicor with root
$path = str_replace('Xicor', __DIR__, $path); // __DIR__ doesn't return a trailing slash
//add .php at end
$path .= '.php';

if(file_exists($path)) {
require_once($path);
}
});

最佳答案

据我了解。 PHP 将在类中的当前命名空间中工作,除非另有说明(前面的\)。

例子

namespace Bar;

class Foo {
function __construct()
{
// references current namespace, looks for Bar\Baz;
$baz = new Baz();
}
}

class Baz {
function __construct()
{
try {
// do stuff

// references global namespace
} catch(\Exception $e) {
var_dump($e->getMessage());
}


}

function foo() {

// This will prepend the current namespace to the class, in actual fact it will first look for "Bar\Bar\Foo"
// When it isnt found, it will move on and look at spl_autoload_register to try to resolve this class,
// Failing that you will get a ClassNotFoundException
$foo = new Bar\Foo();
}
}

请参见。 https://www.php.net/manual/en/language.namespaces.rules.php
https://www.php.net/manual/en/language.namespaces.faq.php#language.namespaces.faq.full以供引用

关于php - 理解 PHP 命名空间的困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57529568/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com