2009-05-22 7 views
1

Ich erstelle eine __get() -Funktion für eine Klasse, um den Zugriff auf meine private Member-Variablen zu steuern. Muss ich die Funktion so entwerfen, dass sie alle möglichen Lesevorgänge für Mitglieder behandelt, oder kann ich sie nicht für Mitglieder schreiben, die öffentlich sind? Außerdem nehme ich an, dass Klassen, die diese Klasse erben, meine __get() - Funktion verwenden, um auf private Mitglieder zuzugreifen.Muss ein überladenes __get alle Mitgliedsvariablen verwalten?

class ClassA{ 
    private $collection = array(); 
    public $value; 

    function __get($item){ 
    return $collection[$item]; 
    } 

Antwort

1

Nein, das tun Sie nicht.


class A { 
    public $foo = 'bar'; 
    private $private = array(); 

    public function __get($key) { 
     echo 'Called __get() at line #' ,__LINE__, ' with key {', $key ,'}',"\n"; 
     return $this->private[$key]; 
    } 

    public function __set($key, $val) { 
     $this->private[$key] = $val; 
    } 
} 


$a = new A(); 

var_dump($a->foo); 
$a->bar = 'baz'; 
var_dump($a->bar); 

Und ja, es wird:


class B extends A { private $private = array(); } 
$b = new B(); 
var_dump($b->bar); 
0

Nun, würden Sie den Code auf private Elemente nicht in Ihrem Array gesetzt. Aber andererseits können Sie dies als einen Weg verwenden, um mit dem zu arbeiten, was in Ihrem Array als solches enthalten ist;

function __get($item){ 
    if (isset ($collection[$item])) 
     return $collection[$item]; 
    else { 
     try { 
      return $this->$item ; // Dynamically try public values 
     } catch (Exception $e) { 
      $collection[$item] = 0 ; // Make it exist 
     } 
    } 
    } 

Klassen, die Ihre Anrufe erben diese __get verwenden(), aber außer Kraft gesetzt werden können, verwenden Sie so parent :: __ construct() für explicity. Beachten Sie auch, dass diese nicht statisch sein können. Further reading.

+0

Ich kann das mit Überlastung umgehen __isset(). –

0

Zunächst sucht PHP in der Klassendefinition nach dem Eigenschaftsnamen und versucht, seinen Wert zurückzugeben. Wenn es keine Eigenschaft gibt - PHP versucht, __get ($ var) aufzurufen, und hier können Sie alles zurückgeben, was Sie wollen. Dies ist ein etwas verwirrendes Verhalten für diejenigen, die Java-ähnliche Getter/Setter kennen, wo Sie sie für jedes Klassenmitglied definieren müssen, auf das Sie zugreifen möchten.

Wenn es bequem ist Java-wie Getter/Setter verwenden - Sie so etwas schreiben kann:

public function __set($var, $value) 
{ 
    if (method_exists($this, $method = "_set_" . $var)) 
    { 
     call_user_func(array($this, $method), $value); 
    } 
} 
public function __get($var) 
{ 
    if (method_exists($this, $method = "_get_" . $var)) 
    { 
     return call_user_func(array($this, $method), $value); 
    } 
} 

und dann diesen Code verwenden, indem Sie definieren individuelle Getter/Setter

protected function _get_myValue() 
    { 
     return $this->_myValue; 
    } 
protected function _set_myValue($value) 
{ 
    $this->_myValue = $value; 
} 

und Zugang auf diese Weise definierte Methoden:

$obj->myValue = 'Hello world!'; 
Verwandte Themen