2017-02-18 11 views
0

Рассмотрим этот пример кодаПочему мой класс php не сохраняет его свойство?

<?php 
class MyAwesomeClass { 
    public $myawesomeproperty = 'test'; 

    public function __construct() { 
     $self = new stdClass(); 

     $self->myawesomeproperty = "hello guys!"; 
    } 
} 

$test_obj = new MyAwesomeClass(); 

echo '<pre>'; 
var_export($test_obj); 
echo '</pre>'; 
?> 

Он должен установить «myawesomeproperty» на новую строку, так var_export показывает «Привет, ребята!» на выходе.

То, что я на самом деле получаю

MyAwesomeClass::__set_state(array(
    'myawesomeproperty' => 'test', 
)) 

Очевидно, функция конструкция делает ничего реального объекта не сохранить.

Почему это происходит? Что мне не хватает?

+0

Не использовать «короткие открытые тег» они давно устарели и очень конкретный сервер. Всегда открывайте свой код с помощью ' miken32

+3

Почему вы делаете это '$ self = new stdClass();'? – AbraCadaver

ответ

1

Вы устанавливаете свойство локальной переменной с именем $self. Если вы хотите изменить свойство объекта, используйте $this вместо:

<?php 
class MyAwesomeClass { 
    public $myawesomeproperty = 'test'; 

    public function __construct() { 
     $this->myawesomeproperty = "hello guys!"; 
    } 
} 

$test_obj = new MyAwesomeClass(); 

echo '<pre>'; 
var_export($test_obj); 
echo '</pre>'; 
?> 
+0

Итак, вы правы, я ошибочно использовал «$ self->», думая, что он будет работать как «self ::», но с общедоступными свойствами, сейчас [this] (http://stackoverflow.com/questions/151969/when -to-use-self-over-this) фактически полностью очистил мой разум. Спасибо за ваш ответ. Самые глупые ошибки настолько очевидны, когда указывают на: D – L1Q

1

Вы создаете другой объект ($ сам) внутри конструктора. Вы ничего не делаете с этим, поэтому объект удаляется из памяти, когда php покидает область действия.

Чтобы перезаписать свойство объекта, прикрепленный к текущей области видимости функции, используйте $this->myawesomeproperty="Hello Guys";