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

声明属性为对象?

陈功
2023-03-14
问题内容

如何将类属性声明为对象?

我试过了:

 public $objectname = new $Object();

但这没有用。另外,为什么要那样做呢?

只实例化该对象并使用其成员不是更好吗?


问题答案:

从有关类属性的PHP手册(重点是我的):

类成员变量称为“属性”。您可能还会看到使用其他术语(例如“属性”或“字段”)来引用它们,但是出于参考目的,我们将使用“属性”。它们是使用关键字public,protected或private之一定义的,后跟普通变量声明。该声明
可以包括一个初始化,但是此初始化必须是一个常量值 -也就是说,它必须能够在编译时进行评估,并且必须不依赖于运行时信息才能进行评估。

要么在构造函数(composition)中创建它

class Foo
{
    protected $bar;
    public function __construct()
    {
        $this->bar = new Bar;   
    }
}

或将其注入到构造函数中聚合

class Foo
{
    protected $bar;
    public function __construct(Bar $bar)
    {
        $this->bar = $bar;   
    }
}

或使用二传手注射。

class Foo
{
    protected $bar;
    public function setBar(Bar $bar)
    {
        $this->bar = $bar
    }
}

您想要聚合而不是合成。



 类似资料:
  • 今天,我意识到让数组像字典一样运行更有意义,这样我就可以通过名称而不是数字索引访问特定元素。我希望能够执行而不是(即使我声明了一个将submitButton映射到请求的索引的枚举)。 这是可行的,但我现在允许一堆欺骗我的代码库,这是很糟糕的。我希望对象知道,只有类型的东西才能放入其中。 我可以用这些字段声明一个类,因为我希望它们的数量在将来可以动态添加,所以下面的操作是不可行的。

  • 在 Gradle 领域模型中所有被增强的对象能够拥有自己定义的属性. 这包括,但不仅限于 projects , tasks , 还有 source sets . Project 对象可以添加,读取,更改扩展的属性. 另外,使用 ext 扩展块可以一次添加多个属性. 例子 13.3. 使用扩展属性 build.gradle apply plugin: "java" ext { springV

  • 由于 Vue 不允许动态添加根级响应式属性,所以你必须在初始化实例前声明根级响应式属性,哪怕只是一个空值: var vm = new Vue({ data: { // 声明 message 为一个空值字符串 message: '' }, template: '<div>{{ message }}</div>' }) // 之后设置 `message` vm.messa

  • 在编写对象时,有没有方法键入对象的属性?与预先定义类型/接口相反。 我唯一能想到的是,但这太宽松了。考虑一下: 我想要<code>myData。myComment</code>抛出相同的错误。 这当然是一个微不足道的例子。但是如果我正在写一个大的复杂的对象,能够动态地声明它的部分类型会很好。

  • API引用 在 1.4 版更改: 声明系统的基本结构现在直接成为SQLAlchemy ORM的一部分。有关这些组件,请参见: declarative_base() declared_attr has_inherited_table() synonym_for() sqlalchemy.orm.as_declarative() 见 声明性扩展 对于其余的声明性扩展类。

  • 我正在从ApacheFelixSCR注释更新到OSGiDSR6注释,而引起我更多问题的是类中的@Property。 在我之前: 现在我有: 和 这一切中最奇怪的事情是: 以前,我可以将我的AImpl类视为组件。 现在,我无法将我的AImpl类视为组件,并且由于不满意的引用,使用它的每个人都无法启动。 为什么像这样改变配置会导致这种行为?也许我错过了什么? 更奇怪的是,我的xml在. jar里面,看