PHP фатальная ошибка: не удается получить доступ к пустому свойству
Я новичок в php
и я выполнил ниже код.
<?php
class my_class{
var $my_value = array();
function my_class ($value){
$this->my_value[] = $value;
}
function set_value ($value){
// Error occurred from here as Undefined variable: my_value
$this->$my_value = $value;
}
}
$a = new my_class ('a');
$a->my_value[] = 'b';
$a->set_value ('c');
$a->my_class('d');
foreach ($a->my_value as &$value) {
echo $value;
}
?>
я получил ниже ошибки. В чем может быть ошибка?
Notice: Undefined variable: my_value in C:xampphtdocsMyTestPagesf.php on line 15
Fatal error: Cannot access empty property in C:xampphtdocsMyTestPagesf.php on line 15
7 ответов:
вы получаете доступ к свойству в неправильном направлении. С помощью
$this->$my_value = ..
синтаксис, вы устанавливаете свойство с именем значения в $my_value. То, что вы хотите$this->my_value = ..
$var = "my_value"; $this->$var = "test";
это то же самое, что
$this->my_value = "test";
чтобы исправить несколько вещей из вашего примера, приведенный ниже код лучше подходит
class my_class { public $my_value = array(); function __construct ($value) { $this->my_value[] = $value; } function set_value ($value) { if (!is_array($value)) { throw new Exception("Illegal argument"); } $this->my_value = $value; } function add_value($value) { $this->my_value = $value; } } $a = new my_class ('a'); $a->my_value[] = 'b'; $a->add_value('c'); $a->set_value(array('d'));
Это гарантирует, что my_value не изменит его тип на string или что-то еще при вызове set_value. Но вы все равно можете установить значение my_value прямой, потому что он публичный. Последний шаг-сделать my_value частным и получить доступ только к my_value через методы getter/setter
во-первых, не объявляйте переменные с помощью var, но
public $my_value;
тогда вы можете получить к нему доступ с помощью
$this->my_value;
, а не
$this->$my_value;
чтобы получить доступ к переменной в классе, необходимо использовать
$this->myVar
вместо$this->$myvar
.и, вы должны использовать идентификатор доступа для объявления переменной вместо
var
.пожалуйста, прочитайте документ здесь.
Как я вижу в вашем коде, похоже, вы следуете старой документации/учебнику о ООП в PHP на основе PHP4 (ООП не поддерживался, но каким-то образом адаптировался для использования простыми способами), так как PHP5 была добавлена официальная поддержка, и нотация была изменена с того, что она была.
пожалуйста, смотрите этот обзор кода здесь:
<?php class my_class{ public $my_value = array(); function __construct( $value ) { // the constructor name is __construct instead of the class name $this->my_value[] = $value; } function set_value ($value){ // Error occurred from here as Undefined variable: my_value $this->my_value = $value; // remove the $ sign } } $a = new my_class ('a'); $a->my_value[] = 'b'; $a->set_value ('c'); // your array variable here will be replaced by a simple string // $a->my_class('d'); // you can call this if you mean calling the contructor // at this stage you can't loop on the variable since it have been replaced by a simple string ('c') foreach ($a->my_value as &$value) { // look for foreach samples to know how to use it well echo $value; } ?>
надеюсь, это поможет
интересно:
- вы объявили массив
var $my_value = array();
- толкнул значение в него
$a->my_value[] = 'b';
- присвоена строка переменной. (так что это больше не массив)
$a->set_value ('c');
- попытался вставить значение в массив, который больше не существует. (это строка)
$a->my_class('d');
и свой
foreach
больше не работать.
таким образом, вы можете создать новый объект с имя настраиваемого свойства.
$my_property = 'foo'; $value = 'bar'; $a = (object) array($my_property => $value);
теперь вы можете добраться до него, как:
echo $a->foo; //returns bar
Я понимаю, что этот ответ не является прямым ответом на проблему, описанную OP, но я нашел этот вопрос в результате поиска того же сообщения об ошибке. Я подумал, что стоит опубликовать мой опыт здесь на всякий случай, если кто-то путает одно и то же...
вы можете столкнуться с ошибкой в вопросе в результате плохо отформатированного
for
цикл над ассоциативным массивом. В припадке костлявости я использовал - > вместо = > в моемfor
заявление:foreach ($object->someArray as $key->$val) { // do something }
конечно, я должен был:
foreach ($object->someArray as $key=>$val) { // do something }
сначала я запутался, думая, что сообщенная ошибка относится к свойству someArray!