Unterschiede in PHP Varianten

Ich meinte mit Factory eher das:

PHP:
    /**
     * get the document object
     * returns the {@link document} object, only creating it if it doesn't already exist, @see application
     *
     * @return document object
     */
    public static function getDocument ()
    {
        if (!self::$document)
        {
            require_once \_wPATH_LIBS_DOCUMENT . \DS . 'document.php';
            self::$document = new document ();
        }

        return self::$document;
    }
 
Zuletzt bearbeitet von einem Moderator:
Sorry für den Doppel, aber hier ist notwendig. Ich habe deine erste Frage noch nicht beantwortet:



Schau dir mal im Code-Beispiel die Methode "getInstance" genau an. Ich schreib sie hier noch mal hin:

PHP:
  public static function getInstance()
  {
    if( null == self::$_instance ) // $this würde einen Fehler werfen
    {
      self::$_instance = new self;
    }
 
    return self::$_instance;
  }

Zuerst wird geprüft, ob die statische Member-Variable $_instance bereits belegt ist. Wenn dem nicht so ist, sie also null ist (Standard-Fall), wird "new self" aufgerufen, was im Prinzip nichts anderes als "neues Selbst" also neue Instanz von sich selbst (eigene Klasse) ist. Natürlich könnt man auch "new Singleton" schreiben, so hat es aber den Vorteil, das man die Klasse einfach umbenennen kann und sie genau das gleiche tut, eine Instanz von sich selbst erzeugen.

Die neue Instanz von sich selbst wird der statischen Mitgliedsvariablen $_instance zugewiesen. Damit ist diese nicht mehr null und beim nächsten Aufruf von "getInstance()" wird der if-Code-Block nicht mehr ausgeführt.

Zuletzt gibt die getInstance()-Methode einfach das Objekt - also die Instanz zurück, die in $_instance drin steht.

Das ist auf jeden Fall schon mal etwas aufschlussreicher, wobei ich glaube ich einfach nur einen Denkfehler habe... Die Klasse wurde ja noch nicht erzeugt, wieso wird sie dann ausgeführt? Eine Klasse kann sich also selbst erzeugen? (so im übertragenden Sinne) Das ist zum Beispiel ein Punkt, der in meinem lieblings Tutorial zu dem Thema noch nicht erwähnt wurde... Der Unterschied zw. Klasse und Objekt ist mir übrigens durchaus klar, es war halt schon eine etwas fortgeschrittene Stunde. Da lässt die Denkleistung nach. Auch das protected kam mir schon mal unter... Das hat meines Wissens nach irgendwas mit Klassenvererbung zu tun.

Wenn ich da jetzt an die schönen Katastrophenfilme denke, in denen KIs die Weltherrschaft an sich reißen, weil sie sich selbst weiterentwickeln... :D

Edit:
Bevor ichs komplett vergess. Smarty kenn ich bereits, damit hab ich auch schon mal experimentiert, wenn auch nicht wirklich erfolgreich. Was - im Gegensatz zu Smarty - ist das Zend Framework? So eine wirklich 100% klare Aussage darüber, was das Zend Framework überhaupt ist, hab ich auf deren Website nicht entdeckt. Weil das ZF scheint mir doch um einiges umfangreicher zu sein als Smarty.
 
Zuletzt bearbeitet:
Ich meinte mit Factory eher das:

PHP:
    /**
     * get the document object
     * returns the {@link document} object, only creating it if it doesn't already exist, @see application
     *
     * @return document object
     */
    public static function getDocument ()
    {
        if (!self::$document)
        {
            require_once \_wPATH_LIBS_DOCUMENT . \DS . 'document.php';
            self::$document = new document ();
        }

        return self::$document;
    }

OT: Zunächst einmal - bitte keine Full-Quotes :)

Dann etwas zum Thema: Streng genommen ist deine Implementierung ein Singleton. Ob die Methode jetzt getInstance() oder getDocument() heißt, ist völlig belanglos. Singletons geben immer die gleiche Instanz zurück. Factories geben immer neue Instanzen zurück. Bitte in wikipedia nachlesen: http://de.wikipedia.org/wiki/Fabrikmethode

Insbesondere das Kapitel Abgrenzung und Verwendung lesen.

Das ist auf jeden Fall schon mal etwas aufschlussreicher, wobei ich glaube ich einfach nur einen Denkfehler habe... Die Klasse wurde ja noch nicht erzeugt, wieso wird sie dann ausgeführt? Eine Klasse kann sich also selbst erzeugen? (so im übertragenden Sinne)

Du kannst mittels des statischen Zugriffs auf eine Klasse eine neue Instanz der selben erzeugen lassen. Genau das macht mein Singleton-Beispiel.

Statische Zugriffe auf Klassen benötigen - ja verbieten quasi - die Verwendung einer Instanz. Daher ist der Operator auch ein anderer:

PHP:
class A
{
  public static function createStatic()
  {
    // Mach irgendwas
  }

  public function doSomethingInstance()
  {
    // Mach was anderes
  }
}

// Statischer Zugriff (ein Objekt ist nicht notwendig)
A::createStatic();

// Instanz-behafteter Zugriff (ein Objekt muss vorher erzeugt werden
$o = new A();
$o->doSomethingInstance();

Auch das protected kam mir schon mal unter... Das hat meines Wissens nach irgendwas mit Klassenvererbung zu tun.

Richtig, protected-Zugriff weicht den private-Zugriff auf. Wenn ich eine Klasse B habe, die von Klasse A erbt, darf die Klasse B die protected-Methoden und -Variablen von A verwenden. Eine Klasse C, die nicht von A oder B erbt, darf nicht auf die protected-Methoden und -Variablen zugreifen.

Was - im Gegensatz zu Smarty - ist das Zend Framework? So eine wirklich 100% klare Aussage darüber, was das Zend Framework überhaupt ist, hab ich auf deren Website nicht entdeckt. Weil das ZF scheint mir doch um einiges umfangreicher zu sein als Smarty.

Das ZF ist ein Rahmenwerk von lose mehr oder weniger von einander abhängigen Komponenten. Einfaches Beispiel:

Klasse Zend_Date: Mit ihr kann man Datumsobjekte erstellen und manipulieren. Natürlich kann man die ganzen Zeit-Funktionen, die PHP so von Haus aus unterstützt (Funktionen aus dem globalen Namensraum wie z.B. strftime() oder mktime()) prozedural verwenden. Zend_Date kapselt diese Funktionen in eine Klasse für die einfache Verwendung.

Klasse Zend_Form: Damit kannst du HTML-Formulare erstellen. Das ist aber ein anderes Konzept, als den HTML-Code selbst zu schreiben. Du erstellst ein neues Objekt aus Zend_Form und hängst da Unterobjekte rein, wie z.B. Zend_Form_Element_Text (ein Input-Feld), Zend_Form_Element_Password (sagt der Name schon) oder Zend_Form_Element_Captcha (ein Form-Element, was ein Captcha darstellen - Captcha ist ein Begriff?). Zusätzlich zu den Elementen kann man Filter und Validatoren an die Elemente hängen, um das Formular nach dem Absenden auf seine Gültigkeit hin zu überprüfen. Also wenn du z.B. in deinem PHP-Code $_POST['form_element'] prüfst, ob da nur Zahlen drin stehen, kann Zend_Form einen Validator Zend_Validate_Int anhängen und damit spart man sich den Code für eine Prüfung.

Zend Framework ist quasi was für faule ;-)

Nein ernsthaft: An einem gewissen Punkt in deiner Programmiererlaufbahn wirst du dir denken: Warum mach ich den gleichen Kram eigentlich immer und immer wieder? Dann ist der Zeitpunkt für ein Framework gekommen. Entweder zu schreibst dir selbst eins (was für den Lern-Effekt sehr cool ist) oder du benutzt ein vorhandenes gepflegtes und stabiles Framework. Es gibt deren mehrere. Zend ist nur eines von vielen. Zu nennen wäre da noch CakePHP oder Symfony.

Letzendlich ist es Geschmackssache, welches man verwenden will. Man sollte sich aber irgendwann für eines entscheiden und dieses dann auch in allen Stärken ausnutzen. Dazu muss man es aber kennen und wissen was es kann.
 
OT: Zunächst einmal - bitte keine Full-Quotes :)

Dann etwas zum Thema: Streng genommen ist deine Implementierung ein Singleton. Ob die Methode jetzt getInstance() oder getDocument() heißt, ist völlig belanglos. Singletons geben immer die gleiche Instanz zurück. Factories geben immer neue Instanzen zurück. Bitte in wikipedia nachlesen: http://de.wikipedia.org/wiki/Fabrikmethode

Insbesondere das Kapitel Abgrenzung und Verwendung lesen.


[x] Du leitest ein Pattern vom Klassennamen ab :D
 
Ok vielen, vielen Dank. Das war jetzt durchaus der knackende Punkt.

saftmeister hat gesagt.:
Zend Framework ist quasi was für faule ;-)
Dass man, statt eine Tabelle selbst zu "schreiben", dann solche Objekte verwenden kann, erinnert mich irgendwie sehr, sehr stark an .aspx
Da musste eigentlich auch keine Ahnung von HTML haben, sondern schmeißt lediglich mit solchen Begriffen um dich. Macht es natürlich irgendwo einfacher.
So einzelne Funktionen zum validieren von Feldern (z.B. Typ int, Typ e-mail, etc.) hab ich mir selber schon mal geschrieben und verwende ich auch in den meisten Projekten. Aber so gesehen ist das ZF natürlich viel umfangreicher.
Ist das ZF gleichzeitig auch eine Templateengine à la Smarty oder lediglich eine Bibliothek für die Programmierung?
 
Das Komplizierte daran (zb. beim Symfony) sind die Querys :D

Da habe ich fast 4 Wochen gebraucht, um zu schnallen, was da eigentlich abgeht, wenn man da mal durchgeblickt hat, will man eigentlich nichts anderes mehr Programmieren, keine Funktionen oder Klassen selber schreiben, keine Formulare mehr, kein HTML, nur noch ein paar Abläufe, Bedingungen und Querys :)
 
Das Problem ist der Umfang. Ich hab mir mal das Handbuch zum ZF angesehen. Wenn das ZF selber genauso umfangreich ist - was ich annehme, weil es sonst nicht ein solches Handbuch bräuchte - dann braucht man ja ewig, bis man da alles "halbwegs intus hat".
 
Ewig nicht, trotzdem ja: Es braucht eine gewisse Einarbeitungszeit.
Aber: Wenn man viel programmiert gleicht der Geschwindigkeitsgewinn
dadurch das locker wieder aus (sonst wäre es ja irgendwie sinnlos und nicht brauchbar)

@bofh: Bitte keine Vollzitate mehr.
 
Nicht unbedingt, wenn du das ZF richtig installiert hast und mit einer IDE arbeitest, werden dir die Methoden und Funktionen vom ZF mit Dokumentation angezeigt:

zend_netbeans.png
(klick mich dick)
 
Zuletzt bearbeitet von einem Moderator:
Das hilft natürlich ungemein, hat Visual Studio auch (und ich bin froh drum gewesen, als ich noch C# programmiert habe). Dennoch muss man natürlich halbwegs Ahnung haben, was man jetzt braucht. Wenn du für jegliche Programmierschritte alle Methoden/Funktionen durchgehen musst, bis du - entnommen aus der beistehenden Dokumentation - die richtige Methode/Funktion hast, na servuß. ^^
Naja, lassen wir das OT.
 

Neue Beiträge

Zurück