Intereting Posts
Лучший способ подсчитать количество загрузок нескольких файлов на веб-сайте Как вставить ключ массива в столбец таблицы и значение как значение столбца в mysql с помощью php? Как скрыть расширение .html с URL-адреса веб-сайта Как получить значение hash (#) в строке запроса Вырезание символов, которые не являются a-zA-Z0-9, _ и – из строк PHP загрузите большой файл размером от 1 до 2 ГБ с помощью загрузки файла jQuery – blueimp (основанный на Ajax) php / yii, который показывает ошибку в браузере Firefox Как я могу переносить данные POST на новую страницу на PHP без формы? нарезать большой файл на куски и загрузить с помощью ajax и html5 FileReader Рекурсивное PHP-регулярное выражение пытаясь поместить данные api в базу данных с помощью php? время ожидания завивки менее 1000 мс всегда терпит неудачу? mysql_real_escape_string () ничего не ускользает используя php для проверки, загружен ли файл javascript? Чтение php генерирует XML во флэш-памяти? Обрезать изображение в PHP

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 

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

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

 public $my_value; 

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

 $this->my_value; 

и не

 $this->$my_value; 

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

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

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

Как я вижу в вашем коде, кажется, что вы следуете старой документации / учебному пособию по ООП в PHP на основе PHP4 (OOP не поддерживался, а адаптировался как-то для использования простым способом), поскольку 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 больше не будет работать.

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

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

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

Конечно, мне следовало бы:

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

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

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

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

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

 echo $a->foo; //returns bar