2012-03-18 3 views
1

Я иду через некоторые вопросы сертификации Zend PHP и я застрял на этом одном:Почему «А» исчезает?

Какой выход из следующих действий:

<?php 

class Magic{ 

    public $a = "A"; 
    protected $b = array("a" => "A", "b" => "B", "c" => "C"); 
    protected $c = array(1,2,3); 

    public function __get($v){ 
     echo "$v,"; 
     return $this->b[$v]; 
    } 

    public function __set($var, $val){ 
     echo "$var: $val,"; 
     $this->$var = $val; 
    } 

} 

$m = new Magic(); 
echo $m->a.",".$m->b.",".$m->c.","; 
$m->c = "CC"; 
echo $m->a.",".$m->b.",".$m->c; 

Ответ: б, в, A, B , C, C: CC, b, c, A, B, C

Я знаю, что __get() и __set вызывается при попытке доступа к/недоступным свойствам, но может кто-то сказать мне, что происходит с $ m -> а? Почему он исчезает?

Заранее спасибо

+0

Что вы подразумеваете под «исчезнуть»? Выход содержит «A». –

+1

Ну его класс «Волшебный» ... Он не просто отдает свои магические секреты! Попробуйте использовать структуру 'AbraCadabra';) – Lix

+1

он ожидал, что« a »будет напечатан __get, но __get не вызывается, так как' $ a' является общедоступным. – dldnh

ответ

7
echo $m->a.",".$m->b.",".$m->c.","; 

Обратите внимание, что строка быть сцеплены, но __get выводит имя ключа. Строчные буквы - это имена клавиш, буквы верхнего регистра - это значения.

б, в, А, В, С, с: CC, б, в, А, В, С

a является доступ нормально, а не через __get, b и c являются доступ к которому осуществляется через __get, а ключи - это номер echo 'd, тогда их значение возвращается, объединяется в строку и выводится после выход «b, c».

Так что это свидетельствует о том, что метод __get запускается для b и c, но не для a, то значения «А», «B» и «C» имеют выход, то значение «CC» установлено, затем b и c доступны через __get, затем снова «A», «B» и «C».

+0

Хороший ответ. Один вопрос: почему «var_dump» ведет себя одинаково? – Shomz

+0

Почему бы и нет? У вас есть конкретный пример? – deceze

+0

На самом деле нет, все в порядке, мое плохое. Var_dump не ведет себя одинаково. – Shomz

2

все переменные в строке

$m->a.",".$m->b.",".$m->c."," 

сначала анализируется, прежде чем он будет отображен.

Таким образом, вызов метода $ m-> b выполняет метод магии __get, который затем echos «$ v», ;, тот же, что и при вызове $ m-> c. Только после того, как все синтаксические выражения проанализированы (и эхо-сигнал из метода __get), то возвращаемые значения будут эхом.

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