2011-12-09 28 views
10

Tôi có câu hỏi này khỏi hướng dẫn nghiên cứu Zend PHP và không thể tìm thấy một lời giải thích hợp ...PHP magic method dụ

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

Theo hướng dẫn, giải pháp sẽ là "b,c,A,B,C,c: CC,b,c,A,B,C". Tôi không thể hiểu tại sao - có thể bạn làm gì? Ý định của tôi là cuộc gọi đầu tiên $ m-> a sẽ dẫn đến kết quả là "a", nhưng điều đó rõ ràng là sai ...

+0

Mã bạn đã cung cấp sẽ xuất ra "' b, c, A, B, Cmc: CC, b, c, A, B, C' "(xem [bằng chứng này] (http://codepad.org/ ez1rSs63)). Đó có phải là lỗi chính tả hoặc nội dung chính xác của hướng dẫn không? – Tadeck

+0

Bạn nói đúng - lỗi đánh máy nhỏ. Bây giờ chính xác là http://codepad.org/H91fpj8q –

Trả lời

14

Kể từ __get() gọi echo, một số dữ liệu được xuất trước echo bên ngoài lớp học được gọi.

Bước qua dòng đầu tiên với echo, đây là cách nó được thực hiện:

$m->a "A" is concatenated 
","  "," is concatenated 
$m->b "b," is echoed, "B" is concatenated 
","  "," is concatenated 
$m->c "c," is echoed, "C" is concatenated 
"m"  "," is concatenated 

Tại thời điểm này, b,c, đã được echo ed, và chuỗi với giá trị của A,B,Cm hiện đang hiển thị.

+0

yep, đúng vậy - tôi đã hoàn thành hôm nay, hoàn toàn bỏ lỡ điều đó! –

+0

+1 Giải thích tốt hơn nhiều. –

+0

Tuyệt vời! Cảm ơn rất nhiều. Tuy nhiên, nếu điều đó xuất hiện trong bài kiểm tra ... :) Cảm ơn bạn! –