2017-02-18 6 views
1

Я новичок в PHP OOP и понимаю, что «Предупреждение: создание объекта по умолчанию из пустого значения» происходит от объекта, который не инициализируется перед записью, но я изо всех сил пытаюсь понять, почему я получаю сообщение об ошибке со следующим кодом.PHP - передача значений вложенным объектам - Предупреждение: создание объекта по умолчанию из пустого значения

Пожалуйста, помогите!

class A { public $varA; } 

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

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

Что произойдет, если вы даете свой класс 'Ā' конструктор? Кроме того, защищенные свойства не могут быть установлены вне класса IIRC. – miken32

+1

Привет Майк. Конструктор в классе A выполняется нормально, но с использованием $ varA = "test"; в этом конструкторе бессмысленно, его забывают. \t Если я использую $ this-> varA = "test"; как было предложено Герджели ниже, тогда он отлично работает ... если я изменю это защищенное свойство на «публичное», как вы сказали. Должен заметить, что $ varA будет привязан только к функции конструктора, но иногда вы не можете видеть дерево для поиска. Спасибо за помощь. – Robbie

+0

Да, я не заметил отсутствующего '$ this' – miken32

ответ

3

При создании экземпляра объекта, вы должны использовать переменную псевдо «$ это» обратиться к свойству объекта.

В вашем коде $varB в 5-й строке не учитывает свойство класса, вместо этого это просто локальная переменная, которая разрушается сразу после завершения функции (поскольку она теряет все ссылки на нее). Подробнее читайте на странице руководства «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); 
+0

Спасибо, Гергели, на месте. – Robbie

+0

Кстати, miken32 правильный, $ varA в классе A должен быть общедоступным. Спасибо за помощь. этот меня заставил меня вырвать мою руку! – Robbie

+0

Не важно. Иногда вы хотите скрыть некоторые свойства из других классов. Чтобы получить доступ к этим переменным скоординированным образом, вы можете расширить свой класс с помощью методов getter/setter. Но да, чтобы сделать '$ obj-> varB-> varA =" Whatever ";' work, он должен быть общедоступным. –

 Смежные вопросы

  • Нет связанных вопросов^_^