2015-09-17 12 views
6

Jestem zdezorientowany, jak działa program; kod powinien wydrukować A, bB ale to pokazano bA,BZachowanie powrotu i echa w 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

Dlaczego sądzisz, że oczekiwany wynik powinien wynosić "A, bB"? –

+1

Obcy dla mnie jest fakt, że ** echo $ m-> b ** zwraca bB i ** echo $ m-> a ** zwraca A, a nie aA –

+3

$ a jest publicznym var, więc nie trzeba go używać metoda __get. –

Odpowiedz

9

To naprawdę ma sens. Pomyślmy o kolejności wykonywania:

Przed PHP może ECHO wybranym ciąg, to musi go ocenić pierwszy (czyli $m->a . ", " . $m->b części)

więc w tym momencie, parser próbuje rozwiązać $ m-> ai $ m-> b, rozpatruje pierwszą, ale druga kończy się niepowodzeniem, więc przechodzimy do metody magicznej.

Magia metoda echa coś (pierwszy `b), a następnie sprowadza się do B.

Teraz musimy dokończyć to, co zaczęliśmy (oryginał ECHO).

Więc co mamy?

  1. rozwiązać $ m-> b (echo w b w procesie).
  2. echo "A, B"

połączyć to wszystko razem?

BA, B

+0

innymi słowy, ciąg budowany przez 'echo $ m-> a ...' stuff nie może być wyprowadzony dopóki ciąg znaków nie zostanie zakończony, więc jego zawartość faktycznie echo PO echu wewnątrz metody. –

+0

dziękuję Patrick – Dudling

+0

@Dudling nie zapomnij przyjąć odpowiedzi, jeśli ci to pomogło :) – Patrick

1

To dziwne, prawda, ale nie robi tego, co myślisz, że to robi.

Uruchamianie tego kodu działa inaczej.

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 . "]"; 

wyjściowa wynosi:

abc[A, B, C]

Oryginalna __get nie zostanie wywołana, gdy robisz $ m-> A ponieważ jest zmienna 'a' tak czy owak. Jest on nazywany tylko ostatecznością, więc powinieneś zamiast tego napisać własną, specyficzną funkcję "gettera".