web-dev-qa-db-de.com

PHP: Reale Welt OOP Beispiel

Ich versuche OOP zu lernen. Die sogenannten "realen" Beispiele in den Büchern, die ich lese, sind nicht hilfreich. 

Alle Beispiele wie Pet, Car, Human helfen mir nicht mehr. Ich brauche REAL LIFE-Beispiele wie Registrierung, Benutzerprofilseiten usw.

Ein Beispiel:

$user->userName = $_POST['userName'];//save username
$user->password = $_POST['password'];//save password
$user->saveUser();//insert in database

Ich habe auch gesehen:

$user->user = (array) $_POST;

woher :

private $user = array();

Enthält alle Informationen in einem Array.

Und innerhalb derselben Klasse liegt

$user->getUser($uid);
// which sets the $this->user array equal to mysqli_fetch_assoc() using 
//the user id.

Gibt es reale Beispiele für die Implementierung von OOP in den vielen verschiedenen PHP-Anwendungen (Registrierung, Login, Benutzerkonto usw.)?

45
BDuelz

Bei OOP geht es nicht nur darum, wie eine einzelne Klasse aussieht und funktioniert. Es geht auch darum, wie Instanzen einer oder mehrerer Klassen zusammenarbeiten.

Deshalb gibt es so viele Beispiele, die auf "Cars" und "People" basieren, weil sie dieses Prinzip wirklich gut verdeutlichen.

Meiner Meinung nach sind die wichtigsten Lektionen in OOP Encapsulation und Polymorphism .

Encapsulation: Koppeln von Daten und der Logik, die auf diese Daten wirkt, auf eine kurze, logische Weise Polymorphismus: Die Fähigkeit eines Objekts, wie ein Objekt auszusehen und/oder sich ähnlich zu verhalten.

Ein gutes Beispiel aus der realen Welt wäre so etwas wie ein Verzeichnis-Iterator. Wo ist dieses Verzeichnis? Vielleicht ist es ein lokaler Ordner, vielleicht ein entfernter Server wie ein FTP-Server. Wer weiß!

Hier ist ein grundlegender Klassenbaum, der die Kapselung demonstriert:

<?php

interface DirectoryIteratorInterface
{
    /**
     * @return \Traversable|array
     */
    public function listDirs();
}

abstract class AbstractDirectoryIterator implements DirectoryIteratorInterface
{
    protected $root;

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

class LocalDirectoryIterator extends AbstractDirectoryIterator
{
    public function listDirs()
    {
        // logic to get the current directory nodes and return them
    }
}

class FtpDirectoryIterator extends AbstractDirectoryIterator
{
    public function listDirs()
    {
        // logic to get the current directory nodes and return them
    }
}

Jede Klasse/jedes Objekt ist für seine eigene Methode zum Abrufen einer Verzeichnisliste verantwortlich. Die Daten (Variablen) sind an die Logik (Klassenfunktionen d. H. Methoden) gekoppelt, die die Daten verwenden.

Aber die Geschichte ist noch nicht vorbei - erinnerst du dich, wie ich sagte OOP geht es darum, wie Instanzen von Klassen zusammenarbeiten, und nicht eine einzelne Klasse oder ein Objekt?

Ok, also machen wir etwas mit diesen Daten - drucken Sie es auf den Bildschirm? Sicher. Aber wie? HTML? Nur-Text? RSS? Lasst uns das ansprechen.

<?php

interface DirectoryRendererInterface
{
    public function render();
}

abstract class AbstractDirectoryRenderer implements DirectoryRendererInterface
{
    protected $iterator;

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

    public function render()
    {
        $dirs = $this->iterator->listDirs();
        foreach ($dirs as $dir) {
            $this->renderDirectory($dir);
        }
    }

    abstract protected function renderDirectory($directory);
}

class PlainTextDirectoryRenderer extends AbstractDirectoryRenderer
{
    protected function renderDirectory($directory)
    {
        echo $directory, "\n";
    }
}

class HtmlDirectoryRenderer extends AbstractDirectoryRenderer
{
    protected function renderDirectory($directory)
    {
        echo $directory, "<br>";
    }
}

Ok, jetzt haben wir ein paar Klassenbäume für das Durchlaufen und Rendern von Verzeichnislisten. Wie benutzen wir sie?

// Print a remote directory as HTML
$data = new HtmlDirectoryRenderer(
  new FtpDirectoryIterator('ftp://example.com/path')
);
$data->render();

// Print a local directory a plain text
$data = new PlainTextDirectoryRenderer(
  new LocalDirectoryIterator('/home/pbailey')
);
$data->render();

Nun, ich weiß, was Sie denken: "Aber Peter, ich brauche diese großen Klassenbäume nicht, um das zu tun!" Aber wenn Sie denken, dass Sie den Punkt verpassen, so wie ich vermute, waren Sie bei den Beispielen "Auto" und "Menschen". Konzentrieren Sie sich nicht auf die Minutien des Beispiels, sondern versuchen Sie zu verstehen, was hier passiert.

Wir haben zwei Klassenbäume erstellt, bei denen einer (*DirectoryRenderer) den anderen (*DirectoryIterator) wie erwartet verwendet - dies wird häufig als contract bezeichnet. Eine Instanz von *DirectoryRenderer kümmert sich nicht darum, welche Art von Instanz von *DirectoryIterator sie empfängt, und Instanzen von *DirectoryIterator kümmern sich nicht darum, wie sie gerendert werden.

Warum? Weil wir sie so gestaltet haben. Sie stecken sich einfach ineinander und arbeiten. Dies ist OOP in Aktion.

80
Peter Bailey

Erwerben Sie ein Buch wie "PHP- und MySQL-Alltags-Apps für Dummies".

Ich weiß, dass es [2005] alt ist, aber es zeigt Konzepte von Benutzeranmeldungen, Foren, Einkaufswagen usw. in prozeduraler und objektorientierter Weise mit Mysqli.

Es half mir, objektorientiertes PHP zu lernen, ich habe es viel gelernt. Das Geld wert.

OOP ähnelt der Gruppierung von Bits Ihres Programms in wiederverwendbare Teile. Es ist nicht so schwer, ehrlich zu sein, es ist nur die Idee, Ihre Funktionen in Klassen zu packen. 

Reales Mini-Beispiel für OOP:

KLASSENDATENBANK
KLASSENSITZUNGEN
KLASSE WEBFORMS
KLASSE EMAIL

KLASSENKONTEN (Beispielfunktionen unten)
FUNKTION SELECTACCOUNT
FUNKTIONSPRÜFUNG
FUNKTION CHECKUSERNAME
FUNKTION CREATEACCOUNT

Ich hoffe, dass Sie dabei bleiben, PHP 6 wird so überarbeitet, dass OOP mehr denn je unterstützt wird.

Viel Glück!

9
RockyBalboa

Obwohl ich weiß, dass diese Frage bereits beantwortet wurde, habe ich das Gefühl, dass ich hier einen Mehrwert schaffen kann.

Ich glaube nicht, dass Sie PHP als Programmiersprache verwenden sollten, um OOP zu lernen. Wenn Sie OOP für Webanwendungen lernen möchten, sollten Sie sich wirklich mit C # oder Java befassen. Sobald Sie OOP gelernt haben, können Sie dieses Wissen auf PHP anwenden. Ein Beispiel für ein Buch, mit dem ich OOP gelernt habe, war Big Java by Cay S. Horstmann

Warum sage ich das ??? Da es buchstäblich Millionen von Beispielen für die Vorgehensweise in PHP gibt, gibt es nur wenige Beispiele für die richtige Programmierung. Darüber hinaus können Sie mit PHP viele Verknüpfungen verwenden, die mit Java nicht akzeptabel wären. Wenn Sie also PHP mit einem Java - Kopf programmieren, sind Sie meiner Meinung nach ein stärkerer Programmierer. OOP ist nicht sprachspezifisch, sondern ein Programmierparadigma.

Wenn Sie OOP mit PHP lernen müssen, empfehle ich Ihnen, einen Blick auf echten Quellcode in öffentlichen Repositorys von github zu werfen. Sie können sie in packagist.org durchsuchen. Wenn es sich um ein anständiges öffentliches Repository handelt, enthält es eine readme.md-Datei, die Ihnen die Verwendung der Pakete composer zeigt. z. B. https://github.com/moltin/laravel-cart ist ein Beispiel für ein Warenkorbpaket, das Sie in Ihrer Anwendung verwenden können. Beachten Sie, dass Sie sich den Quellcode des Pakets nicht ansehen müssen, um zu verstehen, was die Pakete tun. Das Paket wurde geschrieben und Sie interessieren sich nicht dafür, wie sie funktionieren, aber Sie verwenden sie, sodass Sie nur wissen müssen, wie Sie sie verwenden. Genau darum geht es bei OOP.

Es ist mir egal, wie die Warenkorbklasse einen Artikel zum Warenkorb hinzufügt. Ich möchte nur einen neuen Warenkorb erstellen und etwas hinzufügen.

Sie tauchen jedoch in den Quellcode ein, um zu verstehen, wie OOP funktioniert.

Darüber hinaus und wahrscheinlich noch wichtiger für die Entwicklung von Webanwendungen würde ich das MVC-Entwurfsmuster untersuchen.

Das MVC-Entwurfsmuster steht für Model, View, Controller. Wenn im Fall einer Webanwendung das Modell für die Modellierung der Datenbank verantwortlich ist, ist die Ansicht für die Anzeige des Inhalts für den Benutzer verantwortlich. Der Controller ist für die Interaktion mit dem Modell und die Verarbeitung der Benutzereingaben verantwortlich.

Ich denke dann solltest du versuchen das Laravel Framework oder ein anderes "anständiges modernes Framework" auf deinem lokalen Rechner zu installieren. Warum sage ich "modern", weil moderne Frameworks eine Mindestversion PHP von 5.3+ erfordern, was bedeutet, dass das PHP auf Ihrem Computer echtes OOP ähnlich wie dieses unterstützt was Sie von Leuten wie Java bekommen würden.

Es gibt viele Tutorials, die Ihnen zeigen, wie Sie Webanwendungen in laravel erstellen. Sie werden sofort feststellen, dass Sie beim Erstellen eines Controllers einen BaseController erweitern. Wenn Sie ein Modell erstellen, erweitern Sie Eloquent. Dies bedeutet, dass Sie Polymorphism bereits in Ihrem Code verwenden. Sie werden sehen, dass Klassen gekapselt werden und dass jede Klasse eine bestimmte Rolle hat.

Wenn Sie mit der Datenbank interagieren möchten, erstellen Sie zunächst ein new Model -Objekt innerhalb der Controller-Methoden. Wenn Sie mehr darüber erfahren, lernen Sie, wie Sie Abhängigkeiten in den Controller einfügen und dann, wie Sie Ihre Modelle sichern und stattdessen Repositorys und Programme für Schnittstellen erstellen.

Ein anständiges Buch zum Lernen Laravel für Anfänger wäre https://leanpub.com/codebright von Dale Rees. Ich habe Dale vor ungefähr 2 Wochen bei einem Laravel Treffen getroffen.

Darüber hinaus lernen Sie mit zunehmender Kompetenz beim Erstellen von Webanwendungen, wie Sie die folgenden Prinzipien auf Ihre Programmierung anwenden können:

  • Grundsatz der einheitlichen Verantwortung
  • Offenes geschlossenes Prinzip
  • Liskov-Substitutionsprinzip
  • Prinzip der Schnittstellenverschlechterung
  • Prinzip der Abhängigkeitsinversion
2
Gravy

Ich bin in PHP OOP nicht weit gegangen, aber je mehr ich mich damit beschäftige, desto einfacher wird es. Die Objektbeispiele sind nur für Sie da, um zu verstehen, wie OOP funktioniert. Ich verstehe und habe das schon einmal durchgemacht. Bei OOP handelt es sich nur um Eigenschaften und Methoden (normale Variablen und Funktionen). Ich habe in real OOP selbst programmiert und die Beispiele aus meinen Tutorials angewendet und musste nicht unbedingt in der realen Welt sein. Das ist wie mit einem Löffel gefüttert worden, und Sie würden OOP niemals verstehen und wären leicht zu vergessen. Mein Rat lernt verstehen. Wenn Sie verstehen, können Sie alles tun und würden die Kraft von OOP erkennen. Ich habe dieses Buch heruntergeladen und ich denke, Sie sollten es auch tun. Aber das ist wie jemand, der Ihre Apps für Sie erstellt ... 

Hier ein Link zum Buch PHP und MySQL-Alltags-Apps für Dummies 

1
blakroku

Wie Astropanic sagte, könnte man sich den Quellcode eines guten PHP Frameworks oder einer guten Bibliothek ansehen. Ich empfehle Zend Framework , es ist sehr modular und hat ein tolles, professionelles Design. Ich würde sagen, es ist ein sehr guter, objektorientierter PHP Code.

Ich denke jedoch, dass es nicht so einfach ist, aus einem riesigen Stück Produktionscode zu lernen, da es nicht wirklich dazu gedacht ist, Ihnen etwas beizubringen. Wenn Sie jedoch objektorientierten PHP - Code in der realen Welt wünschen, ist das Zend Framework (oder Symfony oder vielleicht CakePHP) wahrscheinlich der richtige Weg.

1
mooware

Ich würde Ihnen raten, sich in diesem Moment von jeglichem Rahmen fernzuhalten, wenn Sie OOP nicht kennen, es wäre zu viel, sich in Zend oder einen anderen Rahmen zu graben.

PHP OOP ist witzig ... wie ha ha funny, weil es unterstützt wird, aber PHP ist keine OOP Sprache wie Java oder C #.

Kurzes Beispiel, nur um meine Aussage zu unterstreichen:

// define class
class User {
// define properties and methods
public $name = "";
}
// instantiate class
$user = new User; // or new User() or new user, it's all the same
echo $user->name;

wenn Sie jedoch OOP "on the fly" tun möchten, können Sie Folgendes tun:

$user = (object) array('name' => 'Peter');

und dann

$user->name;

sie können jedoch OOP wie in Java oder c # verwenden, aber nicht in demselben Maße - und im Hinterkopf, dass beliebte Systeme wie WordPress und Drupal keine reine OOP sind! Sie können aber auch Vererbung und anderes Klassifizieren OOP Sachen in PHP durchführen.

1
kristian nissen

Ich schlage auch vor, meinen Wrapper Arrayzy zu sehen. Es handelt sich um eine native PHP - Arrays-Bibliothek zur einfachen Manipulation auf OOP - Weise.

Wenn Sie also mit nativen PHP -Array-Funktionen arbeiten, können Sie dasselbe in OOP tun, und Arrayzy hilft Ihnen dabei, zum Beispiel:

// Functional programming:
$array = ['a', 'b', 'c'];
$resultArray = array_merge($array, ['c', 'd']);

und

// Object-oriented programming:
$obj = Arrayzy\MutableArray::create(['a', 'b', 'c']);
$obj->mergeWith(['c', 'd']);
$resultArray = $obj->toArray();

In beiden Fällen lautet das Ergebnisfeld:

Array(
    0 => 'a'
    1 => 'b'
    2 => 'c'
    3 => 'c'
    4 => 'd'
)

Prüfen Sie, wie diese mergeWith -Methode (oder andere) unter der Haube funktioniert.

Ich denke, das ist ein schönes Beispiel, das zeigt, dass fast alles funktionaler Code durch OOP Code ersetzt werden könnte, wie in dieser Bibliothek. Aber mit OOP erhalten Sie viel mehr und Sie könnten auch Funktionale Programmierung vs OOP question prüfen, um mehr Details zu erfahren, was ihre Vor- und Nachteile hat.

0