2012-10-09 4 views
7

Ich habe gearbeitet, um zu OOP in PHP zu verschieben. Ich habe Erklärungen auf php.net gelesen, aber ich hatte gehofft, dass ich hier einige konkrete Antworten bekommen könnte.Wie Klassen in PHP zu strukturieren

Ich habe versucht, das folgende Beispiel zu erstellen, um meine Frage zu veranschaulichen. Angenommen, ich habe die Klassen "Datenbank", "Produkte" und "Benutzer" und möchte Produkte anzeigen, wenn ein Benutzer Zugriff hat.

Also rufe ich die "Products" -Klasse "showProducts()" -Funktion, die wiederum eine Instanz der "User" -Klasse erstellt, die eine Instanz des "Database" -Objekts erstellt und überprüft die Benutzerzugriffsebene.

Wenn der Benutzer Zugriff hat, erstellt die Funktion "showProducts()" eine weitere Instanz des Objekts "Database" und fragt die Datenbank ab.

Ich hatte gehofft, jemand könnte veranschaulichen, wie man das auf die richtige Weise macht.

Ich möchte eine Art von Controller-Klasse haben, die ein "Database" -Objekt erstellt, das für alle Klassen verfügbar ist, die darauf zugreifen müssen, ohne mehrere Instanzen des "Database" -Objekts erstellen zu müssen. Ich möchte dasselbe mit der Benutzerklasse, also gibt es ein $ users-Objekt, auf das alle Klassen zugreifen können, ohne jedes Mal ein neues Objekt erstellen zu müssen, wenn ich etwas in der "User" -Klasse verwenden muss.

Ich entschuldige mich, wenn meine Frage nicht klar ist, und danke im Voraus für alle Antworten !!

Danke an alle für die Antworten!

Antwort

11

Wenn Sie von der prozeduralen Prozedur zur objektorientierten Programmierung wechseln, sollten Sie mehr verstehen, als nur Klassen zu erstellen. OOP schreibt keine Klassen, es geht darum, Best Practices, Prinzipien und Muster in OOP zu befolgen.

Sie sollten neue Objekte nicht innerhalb eines anderen instantiieren, Sie sollten das User-Objekt, sein Datenbank-Objekt, von dem der Benutzer abhängt, über den Konstruktor oder die Setter-Methode angeben. Das wird Dependency Injection genannt. Das Ziel besteht darin, Objekte einer Klasse, die sie benötigt, über die Konstruktor- oder Setter-Methode zu übergeben. Und sie sollten von außerhalb dieser Klasse instanziiert werden, also ist es einfacher, die Klasse zu konfigurieren. Und wenn Sie eine Klasse erstellen, möchten Sie leicht sehen, welche Abhängigkeiten diese Klasse hat. Sie können sich hier über Inversion of Control Prinzip lesen: IoC

Also dann würde der Code wie folgt aussehen:

<?php 

// User object that depends on Database object, and expects it in constructor. 

class User 
{ 
    protected $database; 

    public function __construct($database) 
    { 
     $this->database = $database; 
    } 

    // -- SNIP -- 
} 

?> 

nun, dass Benutzerklasse verwenden Sie dies tun:

<?php 

    $database = new Database($connParams); 
    $user = new User($database); 

?> 

Sie können Verwenden Sie auch Dependency Injection mit Setter-Methoden, um Abhängigkeiten zu setzen, aber Il lassen Sie das für sich selbst googeln :)

Thats it, joust lesen über Inversion of Contro Grundsätzlich sind dies die Dependency Injection und Dependency Injection Containers. Dies sind die besten Möglichkeiten, Klassen zu verwalten.

Ich habe viel PHP-Code gesehen, der "OOP" ist und tatsächlich nur Klassen als Namespaces für Funktionen verwendet :) Also, lerne etwas über OOP-Prinzipien und -Muster.

Viel Spaß! :)

+0

Vielen Dank für die Antwort!Wenn ich also eine andere Klasse hätte, auf die in der Benutzerklasse verwiesen wird, würde ich auch das $ user-Objekt als Parameter übergeben? – Ben

+0

Ja, Sie können! Sie können beliebig viele Kurse absolvieren. Sie können Objekt über Konstruktor übergeben, wenn das Objekt dieses Objekt wirklich benötigt. Und Sie können es durch Setter-Methode übergeben, wenn das Objekt optional ist. Sobald Sie komplizierte Abhängigkeiten erhalten, können Sie darüber nachdenken, Dependency Injection Container zu verwenden, in dem Sie Abhängigkeiten beschreiben würden und Container Objekte aus anderen Objekten zusammenstellen und an Sie zurücksenden könnte. Sie können hier mehr über Dependency Injection und Dependency Injection Container lesen : http://fabien.potencier.org/article/12/do-you-need-a-dependency-injection-container – otporan

0

Um ein Objekt für den gesamten Code Verwendung Singleton Muster zu machen:

class Database{ 
    private $db_descriptor; 

    private function __construct(){ 
     /* connect and other stuff */ 
    } 
    public static function getInstance(){ 
     static $instance; 
     if($instance === null){ 
      $instance = new self(); 
     } 
     return $instance; 
    } 
} 

Und Sie die gleiche Technik mit Benutzern verwenden können, sagen, dass ich mehr mit PHP 5.4 Sie 1 Merkmal für Singletonmuster verwenden können. Ein letzter Tipp: Wenn Sie mit Datenbank und anderen schweren Dingen arbeiten, verwenden Sie die Technik lazy initialization. Wenn Sie Ihre OOP Fähigkeiten verbessern, schauen Sie sich Doctrine Project an, sie benutzen diese Techniken sehr!

+0

Eigentlich würde ich empfehlen, jetzt Beispiele von Enterprise-Frameworks zu betrachten, um ein Gefühl dafür zu bekommen, wie die Dinge gemacht werden. Sie müssen vielleicht nicht sofort das Programm verwenden, aber sie geben Ihnen eine gute Vorstellung davon, wie Sie Dinge strukturieren können. – prodigitalson

+0

Können Sie irgendwelche beraten? Ich habe vorher nicht mit ihnen gearbeitet. – kirugan

+1

Symfony2 und Zend2 Frameworks sind die einzigen Frameworks, die es wert sind, betrachtet zu werden :) Ich weiß, dass ich dafür viele Abstimmungen bekommen werde. Aber diese beiden sind am besten, um die richtige OOP in PHP zu lernen! – Limeni

2

Objekte nicht in Ihren Konstruktoren oder anderen Methoden instanziieren. Übergeben Sie sie als Parameter, vorzugsweise in einer anderen Klasse, die als Factory bezeichnet wird. Auf diese Weise können Sie Ihren Code einfach testen, aber auch die Erstellung der Objekte vereinfachen.

Versuchen Sie auch nicht, Singletons zu verwenden. Dies ist die objektorientierte Version von "globalen Variablen", und Sie möchten keine globalen Variablen verwenden. Es macht das Testen Ihres Codes wirklich schwierig, fast unmöglich.

Sehen Sie dieses Video http://www.youtube.com/watch?v=-FRm3VPhseI zu verstehen, warum es schlecht ist, Singletons zu verwenden. Besonders das CreditCard-Beispiel um 19:00 Uhr ist sehenswert.

Wenn Sie wirklich auf dem neuesten Stand der Technik sein wollen, schauen Sie sich das Konzept der "Abhängigkeitsinjektion" an. Im Wesentlichen ist die Weitergabe von Dingen, die von außen in eine Klasse benötigt werden, das ganze Geheimnis, aber es gibt Frameworks, die dies automatisch für Sie tun, so dass Sie keine Fabrik mehr selbst schreiben müssen. Diese werden "Dependency Injection Container" oder "DIC" genannt.

+0

Vielen Dank! Google-Werbeklasse jetzt. Kennen Sie gute allgemeine Tutorials zum Aufbau von Klassenstrukturen für Websites? Ich beginne zu verstehen, Prinzipien, aber soweit eine praktische Umsetzung, ich bin noch ein wenig verloren. – Ben

+0

Zuerst würde ich empfehlen, dass Sie einen Blick auf Autoloading werfen. Es gibt mehrere Systeme, um dies zu vereinfachen, aber es läuft darauf hinaus, Ihre Klassen - eine Klasse pro Datei - in einer Verzeichnisstruktur zu organisieren und die Klassennamen entsprechend auszurichten, damit der Autoloader, der nur den benötigten Klassennamen als Parameter erhält, konstruieren kann der Pfad und der Dateiname, in dem sich die Klasse befinden soll. Betrachten Sie das Zend Framework (1 oder 2) als Beispiel. Vielleicht bekommen Sie auch eine Vorstellung davon, wie andere Leute ihre Klassen dort nennen. – Sven