Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP-将值传递给嵌套对象-警告:从空值创建默认对象_Php_Oop - Fatal编程技术网

PHP-将值传递给嵌套对象-警告:从空值创建默认对象

PHP-将值传递给嵌套对象-警告:从空值创建默认对象,php,oop,Php,Oop,我是PHP OOP新手,并且理解“警告:从空值创建默认对象”来自一个在编写之前没有初始化的对象,但我很难理解为什么下面的代码会出现错误 请帮忙 class A { public $varA; } class B { public $varB; function __construct(){ $varB = new A; } } $obj = new B; $obj->varB->varA = "Whatever"; 创建对象实例时,应使用伪变量“$this”来处

我是PHP OOP新手,并且理解“警告:从空值创建默认对象”来自一个在编写之前没有初始化的对象,但我很难理解为什么下面的代码会出现错误

请帮忙

class A { public $varA; }

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

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

创建对象实例时,应使用伪变量“$this”来处理对象的属性

在您的代码中,第5行中的
$varB
并没有处理class属性,而是一个局部变量,它在函数完成后立即被销毁(因为它释放了对它的所有引用)。请在“”手册页中阅读有关此行为的更多信息

因此,您的代码应该如下所示:

class A { public $varA; }

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

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

如果给类
A
A构造函数,会发生什么?另外,不能从类IIRC之外设置受保护的属性。你好,迈克。类A中的构造函数执行ok,但使用$varA=“test”;在这种情况下,构造函数是没有意义的,它会被遗忘。如果我使用$this->varA=“test”;正如下面Gergely所建议的那样,它工作得很好。。。如果我像你说的那样把受保护的财产改成“公共的”。应该已经注意到$varA的作用域仅限于构造函数,但有时您看不到寻找的木材。谢谢你的帮助。是的,我没有注意到丢失的
$this
谢谢Gergely,现场。顺便说一下,miken32是正确的,A级的$varA需要公开。谢谢你们的帮助,伙计们。这一次让我咬断了手臂!没有必要。有时,您希望对其他类隐藏某些属性。要以协调的方式访问这些变量,可以使用getter/setter方法扩展类。但是,是的,让
$obj->varB->varA=“随便什么”工作,它需要公开。是的,我正在使用getter和setter。我的错误来自于试图将问题简化到这里——原始代码太难理解了。