【问题标题】:PHP - passing values to nested objects - Warning: Creating default object from empty valuePHP - 将值传递给嵌套对象 - 警告:从空值创建默认对象
【发布时间】:2017-02-18 12:54:21
【问题描述】:

我是 PHP OOP 的新手,并且了解“警告:从空值创建默认对象”来自于在写入之前未初始化的对象,但我很难理解为什么我会收到错误下面的代码。

请帮忙!

class A { public $varA; }

class B {
    public $varB;
    function __construct(){ $varB = new A; }
}

$obj = new B;
$obj->varB->varA = "Whatever";

【问题讨论】:

  • 如果你给你的类A一个构造函数会发生什么?此外,不能从 IIRC 类之外设置受保护的属性。
  • 你好迈克。 A 类中的构造函数执行正常,但使用 $varA="test";在那个构造函数中是没有意义的,它被遗忘了。如果我使用 $this->varA="test";正如下面 Gergely 所建议的那样,它可以正常工作......只要我像你说的那样将该受保护的财产更改为“公共”。应该已经发现 $varA 只会作用于构造函数,但有时你看不到木头。感谢您的帮助。
  • 是的,我没有注意到缺少的$this

标签: php oop


【解决方案1】:

当你创建一个对象的实例时,你应该使用伪变量"$this"来寻址对象的属性。

在您的代码中,第 5 行中的 $varB 没有解决类属性,而只是一个局部变量,在函数完成后立即被销毁(因为它丢失了对它的所有引用)。在“variable scopes”手册页中阅读有关此行为的更多信息。

所以你的代码应该是这样的:

class A { public $varA; }

class B {
    public $varB;
    function __construct(){ $this->varB = new A(); }
}

$obj = new B();
$obj->varB->varA = "Whatever";
var_dump($obj);

【讨论】:

  • 谢谢 Gergely,当机立断。
  • 顺便说一句,miken32是正确的,A类中的$varA需要是public的。感谢小伙伴们的帮助。这把我的胳膊咬断了!
  • 不一定。有时您想对其他类隐藏一些属性。要以协调的方式访问这些变量,您可以使用 getter/setter 方法扩展您的类。但是,是的,要使$obj->varB->varA = "Whatever"; 工作,它需要公开。
  • 是的,我正在使用 getter 和 setter。我的错误来自于试图简化问题以在此处发布 - 原始代码太可怕了。
猜你喜欢
  • 2023-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-30
  • 2013-06-19
  • 2016-07-31
相关资源
最近更新 更多