[英]Using a PHP variable to instantiate a class - problems with namespaces
以下所有示例都基於所有文件都存在於正確位置的保證。 我高音檢查過這個。
(1)這在不使用命名空間時有效:
$a = "ClassName";
$b = new $a();
這不起作用:
// 'class not found' error, even though file is there
namespace path\to\here;
$a = "ClassName";
$b = new $a();
這個工作:
namespace path\to\here;
$a = "path\to\here\ClassName";
$b = new $a();
因此,當使用變量實例化類時,似乎忽略了名稱空間聲明。
有沒有更好的方法(比我上一個例子)所以我不需要經歷一些代碼並更改每個變量以包含命名空間?
命名空間始終是完整類名的一部分。 使用一些use語句,您只能在運行時為類創建別名。
<?php
use Name\Space\Class;
// actually reads like
use Name\Space\Class as Class;
?>
類之前的名稱空間聲明只告訴PHP解析器該類屬於該名稱空間,對於實例化,您仍需要引用完整的類名(包括如前所述的名稱空間)。
要回答您的具體問題,不,沒有比您的問題中包含的最后一個示例更好的方法。 雖然我用雙引號字符串來逃避那些壞的反斜杠。*
<?php
$foo = "Name\\Space\\Class";
new $foo();
// Of course we can mimic PHP's alias behaviour.
$namespace = "Name\\Space\\";
$foo = "{$namespace}Foo";
$bar = "{$namespace}Bar";
new $foo();
new $bar();
?>
*)如果使用單引號字符串,則無需轉義。
在字符串中存儲類名時,需要存儲完整的類名,而不僅是相對於當前名稱空間的名稱:
<?php
// global namespace
namespace {
class Outside {}
}
// Foo namespace
namespace Foo {
class Foo {}
$class = "Outside";
new $class; // works, is the same as doing:
new \Outside; // works too, calling Outside from global namespace.
$class = "Foo";
new $class; // won't work; it's the same as doing:
new \Foo; // trying to call the Foo class in the global namespace, which doesn't exist
$class = "Foo\Foo"; // full class name
$class = __NAMESPACE__ . "\Foo"; // as pointed in the comments. same as above.
new $class; // this will work.
new Foo; // this will work too.
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.