当前位置: 首页 > 面试题库 >

将名称空间与通过变量创建的类一起使用

郤望
2023-03-14
问题内容

所以我创建了这两个类

//Quarter.php
namespace Resources;
class Quarter {
    ...
}


//Epoch.php
namespace Resources;
class Epoch {

    public static function initFromType($value, $type) {
        $class = "Quarter";
        return new $class($value, $type);
    }    
}

现在这是两者的简化版本,但足以说明我的问题。此处显示的类将无法使用,因为找不到四分之一类。为了使其工作,我可以将$ class变量更改为

$class = "\Resources\Quarter";

所以我的问题是:当两个类已经是同一个命名空间的成员时,为什么需要在这里使用命名空间。仅当我将类名放入变量中时,才需要名称空间:

    public static function initFromType($value, $type) {
        return new Quarter($value, $type);
    }

可以正常工作。为什么会这样?在这里有什么需要避免的潜在陷阱吗?


问题答案:

因为可以将字符串从一个名称空间传递到另一个名称空间。这就使名称解析充其量是模棱两可的,并且容易引入奇怪的问题。

namespace Foo;

$class = 'Baz';

namespace Bar;

new $class;  // what class will be instantiated?

某个名称空间中的文字不存在此问题:

namespace Foo;

new Baz;     // can't be moved, it's unequivocally \Foo\Baz

因此,所有“字符串类名”始终都是绝对的,需要写为FQN:

$class = 'Foo\Baz';

(注意:无领导\。)

您可以将其用作速记,相当于类中的自引用self

$class = __NAMESPACE__ . '\Baz';


 类似资料:
  • 问题内容: 我正在尝试使用动态变量名称(我不确定它们的实际名称),但是非常像这样: 返回值告诉我它不起作用。我不知道我在寻找什么语法或技术,这使得很难研究。在前面定义。 问题答案: 将它们包装在: 工作实例 使用是创建动态变量的一种方法,简单的示例:

  • 我正在做一个分配,对于其中一个方法,我希望每次调用该方法时都创建一个新的arraylist。 下面是我的方法 } 当我试图创建一个与java.lang.String id变量同名的ArrayList时,我得到了一个错误。但是,每次调用此方法时,我都希望创建一个ArrayList,该ArrayList的名称是id唯一的,以便以后可以使用它。例如,如果id是“Steve”,我可以将arrayList称

  • 问题内容: 我想使用变量名创建备份SQL表。 类似于 但是我越来越 ‘@SQLTable’附近的语法不正确。 这只是用于维护的小脚本的一部分,因此我不必担心注射。 问题答案:

  • 问题内容: 我正在寻找可以构造使用名称空间的XML文档的Java代码。我似乎无法使用我最喜欢的工具找到任何东西,因此希望有人可以帮助我。 问题答案: 我不确定您要做什么,但是我将jdom用于大多数xml问题,并且它支持名称空间(当然)。 代码: 产生以下xml: 其中应包含您需要的一切。希望能有所帮助。

  • 当你使用了一个未知的变量名,通常 JavaScript 会自动创建全局变量: function f() { foo = 123 } f() foo 123 好在你会在 ECMAScript5 的严谨模式得到警告[1]: function f() { 'use strict'; foo = 123 } f() ReferenceError: foo is not defined 参考 [1] Jav

  • 我有一个类(在我的项目中是一个单例),带有一些变量。我想通过在函数中传递变量的名称来获得其中的一个变量。现在我有: