簡體   English   中英

使用PHP變量實例化一個類 - 命名空間的問題

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM