2015-09-17 13 views
6

Tôi nhầm lẫn về cách chương trình đang hoạt động; mã nên in A, bB nhưng mã đang hiển thị bA,BHành vi trả lại và phát lại trong php

class SampleClass { 
    public $a = "A"; 
    protected $b = array ("a" => "A", "b" => "B", "c" => "C"); 

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

$m = new SampleClass(); 

echo $m->a . ", " . $m->b; 
+1

Tại sao bạn nghĩ, đầu ra dự kiến ​​đó phải là 'A, bB'? –

+1

Stranger đối với tôi là thực tế là ** echo $ m-> b ** trả về bB và ** echo $ m-> a ** trả về A và không phải aA –

+3

$ a là một var công khai nên nó không cần sử dụng phương thức __get. –

Trả lời

9

Điều này làm cho cảm giác hoàn hảo thực sự. Hãy suy nghĩ về thứ tự thực hiện:

Trước PHP có thể ECHO chuỗi yêu cầu của bạn, nó phải đánh giá nó đầu tiên (tức là phần $m->a . ", " . $m->b)

Vì vậy, tại thời điểm này, phân tích cú pháp cố gắng giải quyết $ m-> a và $ m-> b, nó giải quyết đầu tiên, nhưng lần thứ hai thất bại, vì vậy chúng tôi đi đến phương pháp ma thuật.

Sự kỳ diệu phương pháp echos cái gì đó (người đầu tiên `b), và sau đó giải quyết riêng của mình đến B.

Bây giờ, chúng ta cần phải hoàn thành những gì chúng tôi bắt đầu (echo bản gốc).

Vậy chúng ta có gì?

  1. giải quyết $ m-> b (echo in b trong quá trình).
  2. echo "A, B"

kết hợp tất cả lại với nhau?

bA, B

+0

nói cách khác, chuỗi được xây dựng bởi công cụ 'echo $ m-> a ...' không thể xuất cho đến khi chuỗi được hoàn thành, vì vậy nội dung của nó thực sự lặp lại SAU bên trong phương thức. –

+0

cảm ơn bạn Patrick – Dudling

+0

@Dudling đừng quên chấp nhận câu trả lời nếu nó giúp bạn :) – Patrick

1

Điều này thật kỳ lạ không phải là nó nhưng nó không làm những gì bạn nghĩ nó đang làm.

Chạy mã này có điều gì đó khác.

class SampleClass { 
    public $aaa = "A"; 
    protected $b = array ("a"=> "A", "b" => "B", "c" => "C"); 

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


$m = new SampleClass(); 

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

Output là:

abc[A, B, C]

__get gốc của bạn không được gọi khi bạn làm $ m-> a kể từ khi có một biến 'a' dù sao đi nữa. Nó chỉ được gọi là phương sách cuối cùng nên bạn nên viết hàm 'getter' của riêng bạn thay thế.

Các vấn đề liên quan