2013-02-17 4 views
54

Я новичок в 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 
+9

Если вы только учитесь PHP, обратите внимание на некоторые учебники более уточненный ... использование 'var' и метод с тем же именем, что и класс, указывает на довольно старый, устаревший учебник –

+0

@MarkBaker благодаря вашим инструкциям. – Bishan

ответ

159

Вы получаете доступ к собственности неправильным образом. С синтаксисом $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

+0

Тогда я получаю сообщение об ошибке «Неустранимая ошибка: [] оператор не поддерживается для строк в C: \ xampp \ htdocs \ MyTestPages \ f.php в строке 12'. Строка 12 - это $ this-> my_value [] = $ value; ' – Bishan

+0

Конечно. Set_value меняет тип из my_value из массива в строку. Вероятно, вы хотите изменить код внутри set_value на '$ this-> my_value [] = $ value;' – Philipp

+0

Спасибо Philipp. – Bishan

9

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

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

Прочтите документ here.

+0

Тогда я получаю сообщение об ошибке «Неустранимая ошибка: [] оператор не поддерживается для строк в C: \ xampp \ htdocs \ MyTestPages \ f.php в строке 12'. Строка 12 - это $ this-> my_value [] = $ value; ' – Bishan

+0

Вы не можете назвать' $ this-> my_value [] 'у вас должно быть значение в' [] '. – Val

27

Во-первых, не объявлять переменные, используя вар, но

public $my_value; 

Затем вы можете получить доступ к нему с помощью

$this->my_value; 

и не

$this->$my_value; 
1

Интересно:

  1. Вы объявили Массив var $my_value = array();
  2. ТОЛКАЕМОГО значение в его $a->my_value[] = 'b';
  3. Assigned строки переменный. (так что больше нет массива) $a->set_value ('c');
  4. Пробовал выталкивать значение в массив, которого больше не существует. (it's string) $a->my_class('d');

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

5

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

?> 

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

0

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

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

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

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

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

я путать себя в первую, думая, что сообщаемая ошибка ссылалась на свойство someArray!

1

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

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

Теперь вы можете добраться нравится:

echo $a->foo; //returns bar 
+0

было бы подробнее ..! – Chella

Смежные вопросы