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 58

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;
}

?>

надеюсь, это поможет

интересно:

  1. вы объявили массив var $my_value = array();
  2. толкнул значение в него $a->my_value[] = 'b';
  3. присвоена строка переменной. (так что это больше не массив)$a->set_value ('c');
  4. попытался вставить значение в массив, который больше не существует. (это строка) $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!