2013-07-04 6 views
6

Ich bin ein wenig unklar über die korrekte Verwendung von statischen Methoden in PHP.Korrekte Verwendung von "getInstance" und statischen Methoden in PHP?

Im folgende Szenario:

<?php 

class Person 
{ 
    public $data; 

    public function __construct($id) 
    { 
     // Fetch record from our data source 
     switch($id){ 
      case 1: 
       $this->data = array('id'=>1, 'name'=>'Mike'); 
       break; 
      case 2: 
       $this->data = array('id'=>2, 'name'=>'Jennifer'); 
       break; 
      default: 
       exit('Record not found!'); 
     } 
    } 

    public function getName() 
    { 
     return $this->data['name']; 
    } 

    public static function getInstance($id) 
    { 
     return new self($id); 
    } 
} 

?> 

mich dann gibt die Namen "Mike" und "Jennifer":

Beispiel A

<?php 

foreach(array(1,2) as $id) 
    echo Person::getInstance($id)->getName(); 

?> 

Beispiel B

<?php 

foreach(array(1,2) as $id){ 
    $person = new Person($id); 
    echo $person->getName(); 
} 

?> 

Entweder wird "MikeJennifer" gedruckt, aber mir wurde gesagt Beispiel A ist falsch, "weil Person keine statische Klasse ist".

Eine Klasse kann in PHP nicht als "statisch" deklariert werden, also warum sollte es eine Rolle spielen?

+1

"aber mir wurde gesagt, Beispiel A ist falsch" --- es ist nicht. Die Person, die es dir erzählt hat, ist falsch. – zerkms

+2

Warum ist die Person falsch? Das erste Snippet sieht aus wie ein Singleton-Muster. Es scheint in diesem Fall nicht erforderlich zu sein ... –

+0

Diese Klasse würde immer noch mehrere Instanzen zulassen. Es sieht also nach einer schlechten Implementierung eines Singleton aus. Eine Art Hybridklasse – tlenss

Antwort

3

In "Emergent Design" beschreibt Scott L. Bain dies als ein erstes Schrittmuster beim Abstrahieren der Erstellung von Objekten.

Tag 1: Keine Abstraktion ...

$person = new Person($id); 

Tag 2: eine statische Methode, das Objekt für Sie ...

$person = Person::getPerson($id); 

Warum zu bauen? Weil Sie jetzt nur einen Code in Ihrer gesamten Anwendung haben, der weiß, wie man eine Person "neu aufbaut", anstatt viele Codezeilen in der gesamten Anwendung zu verteilen, die dieses Wissen besitzen. Wenn Sie ändern, wie Sie ein Personenobjekt in der Zukunft bauen, können Sie nur die statische Methode getPerson ändern.

Tag 3+: Sie können sich entscheiden, sich auf einen Objektgenerator oder ein Repository zum Erstellen des Objekts zu stützen. Wenn Sie dies tun, können Sie Ihre statische Methode getPerson aktualisieren, um den Builder/das Repository zu verwenden, und die Änderung erfolgt wiederum an nur einer Stelle.

Dies wird "Kohäsion" genannt. Code, mit dem Sie Änderungen vornehmen können, ohne viele Dateien öffnen zu müssen.

+0

Nicht zu widersprechen, scheint dies interessant, aber was ist der Unterschied zwischen der Änderung der 'getPerson'-Methode und nur die Änderung des' Person' Konstruktors? –

+0

@Wesley Murch: Das könnte etwas Licht werfen: http://en.wikipedia.org/wiki/Builder_pattern – zerkms

+1

Wenn Sie 'neue Person ($ id)' in Ihrem Code (sagen wir 20 Mal) verwenden, müssen Sie die ändern Konstruktor 20 mal. Mit 'Person :: getPerson ($ id)' müssen Sie diesen Code nicht ändern. Zum Beispiel, wenn ich eine Abhängigkeit in "neue Person" übergeben müsste, müsste ich die Abhängigkeit nicht an 20 Stellen erstellen und übergeben, sondern nur an eine. – Fenton

Verwandte Themen