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:\xampp\htdocs\MyTestPages\f.php on line 15

Fatal error: Cannot access empty property in C:\xampp\htdocs\MyTestPages\f.php on line 15

Ответ 1

Вы получаете доступ к собственности неправильно. С синтаксисом $this->$my_value = .. вы устанавливаете свойство с именем значения в $my_value. Вы хотите $this->my_value = ..

$var = "my_value";
$this->$var = "test";

совпадает с

$this->my_value = "test";

Чтобы исправить несколько вещей из вашего примера, приведенный ниже код лучше aproach

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 не изменит его тип на строку или что-то еще, когда вы вызываете set_value. Но вы все равно можете установить значение my_value direct, потому что оно открыто. Последний шаг: сделать my_value приватным и получить доступ только к my_value по методам getter/setter

Ответ 2

Во-первых, не объявляйте переменные с помощью var, но

public $my_value;

Затем вы можете получить к нему доступ, используя

$this->my_value;

а не

$this->$my_value;

Ответ 3

Чтобы получить доступ к переменной в классе, вы должны использовать $this->myVar вместо $this->$myvar.

И вы должны использовать идентификатор доступа для объявления переменной вместо var.

Пожалуйста, прочитайте документ здесь.

Ответ 4

Как я вижу в вашем коде, кажется, что вы следуете старой документации/учебному пособию по ООП в 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;
}

?>

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

Ответ 5

Интересно:

  • Вы объявили массив var $my_value = array();
  • Вложенное значение в него $a->my_value[] = 'b';
  • Назначение переменной переменной. (так что это больше не массив) $a->set_value ('c');
  • Пытался подтолкнуть значение к массиву, который больше не существует. (это строка) $a->my_class('d');

И ваш foreach больше не будет работать.

Ответ 6

Я понимаю, что этот ответ не является прямым ответом на проблему, описанную OP, но я нашел этот вопрос в результате поиска того же сообщения об ошибке. Я думал, что стоит опубликовать мой опыт здесь, на всякий случай, когда кто-то путается над тем же...

Вы можете столкнуться с этой ошибкой в ​​результате плохо отформатированного цикла for над ассоциативным массивом. В припадке костяной головы я использовал → вместо = > в своем выражении for:

        foreach ($object->someArray as $key->$val) {
            // do something
        }

Конечно, я должен был:

        foreach ($object->someArray as $key=>$val) {
            // do something
        }

Сначала я запутался, думая, что сообщаемая ошибка относится к свойству someArray!

Ответ 7

Таким образом вы можете создать новый объект с настраиваемым именем свойства.

$my_property = 'foo';
$value = 'bar';
$a = (object) array($my_property => $value);

Теперь вы можете достичь его, как:

echo $a->foo;  //returns bar