OOP Tutorial mit Realitätsbezug?

ms92

Mitglied
Hallo,
gibt es irgendein Tutorial für objektorientierte Programmierung in PHP, wo nicht als Beispiel ein Auto, Pferd oder Bier genommen wird, sondern einfach eine kleine Online-Applikation? Ich habe mir nämlich schon so einiges durchgelesen zu OOP, jedoch weiß ich nicht, wann ich das jetzt einsetzen soll... Ich weiß nicht, warum man nicht einfach Funktionen nimmt!
Der letzte Beitrag in diesem Forum: http://www.traum-projekt.com/forum/...bjektorientierte-programmierung-in-php-7.html ist genau das was mein Problem ist. Nur leider wird das dann nicht weiterbesprochen...
Kann mir das jmd hier erklären oder ein (wirklich) gutes Tutorials empfehlen (ich habe 2 Bücher zu PHP, jedoch ist da auch nur so ein total abtraktes Beispiel mit Auto und so...).
Gruß
ms92
 
also ich denke schon, dass ich genug basiswissen habe... nur ich verstehe nicht, warum man nicht einfach Funktionen erstellt anstatt solche Klassen...
 
Klassen haben aus meiner sicht eine bessere wiederverwendbarkeit als funktionenen....
Man betrachte jetzt nicht nur 1 Projekt sondern x Projekte dann ist dies sicher von Vorteil...

Ein weiterer Vorteil ist wohl, (abhängig davon wie gut programmiert) kann relativ einfach ein objekte austauscht werden und man kann von mysql auf xml umsteigen oder aus der html-ausgabe pdf-ausgabe usw...

Wer den Werdegang von PHP beobachtet hat sieht in bezug auf php6 das auf lang gesehen kein weg mehr an oop vorbeiführt.

Ich würde dir doch empfehlen, fang erstmal an ein kleines basicgerüst aufzubauen oder eins besser kennen lernen wie zendframework, symfony oder cakephp.

Falls selbst eins entwickeln, fängt man meist an mit dingen wie:
db, email, form, validate, usw...
 
Abstraktion, Kapselung und Wiederverwendbarkeit... Das sind so in etwa die Grundpfeiler der objektorientierten Programmierung und werden wohl auch überall erwähnt. Letztenendes ist es eine Sache dessen, wie man was machen möchte: Niemand zwingt dich zur Objektorienterung, wenn du es für nicht nötig erachtest.
Der reelle Nutzen kommt dann, wenn du diverse Applikationen schreiben musst, die irgendwie immer etwas gemeinsam haben, bei denen aber trotz spezieller Probleme immer neue und andere Funktionen erfordern, oder weitere Eigenschaften hinzukommen. Des Weiteren hat man in einer Klasse normalerweise bestimmte Bestandteile gekapselt, die von Außen nicht erreichbar sind und somit ein Überschreiben unmöglich wird.

Statt einem global Schlüsselwort wird eine Referenz auf die Instanz verwendet, statt der Speicherung der Werte im Global Scope, findet dies instanzintern getan.

Nehme man zB mal eine Mail-Klasse als triviales Beispiel: Man beginnt normalerweise bei einer einfachen Funktion, wie
PHP:
function mail( $from, $to, $subject, $message, $headers = null ) {
    // ... tue was
    return $success;
}
Was aber, wenn man ein wenig mehr Kontrolle möchte? Wie soll man dann eine Funktion gestalten?
PHP:
function mail_factoringTo( array $to ) {
    return implode( ', ', $to );
}

function mail( $from, ... ) { ... }
Und nun wollen wir noch eine Überprüfung einbauen, ob auch alle Adressen valide sind:
PHP:
function mail_checkAdressValidity( $mail ) {
    return 1 === preg_match( "%^pattern$%Ui", $mail );
}

function mail_factoringTo( array $to ) {
    if ( 0 < count( $args = func_get_args() ) ) {
        $return = array_pop( $to );
        while ( null !== ( $current = array_pop( $to ) ) && mail_checkAdressValidity( $current ) ) {
            $return .= $current;
        }
        return $return;
    } else {
        return null;
    }
}

Und so weiter. Irgendwann landen wir dann bei:

PHP:
<?php
mail( $from, mail_factoringTo( $arrayTo ), $subject, $message );

Und dann fällt uns auf, dass wir mal Carbon Copies und Blind ~ benötigen könnten, oder dass der Versand auch über SMTP funktioneren soll. Alle Funktionen umschreiben? Warum nicht gleich mal ein wenig nachgedacht und abstrahiert?

PHP:
<?php

abstract class Mail_Abstract {
    
    protected $_from = "";
    protected $_to   = array();
    protected $_cc   = array();
    protected $_bcc  = array();

    protected $_subject = "";
    protected $_message = "";
    
    protected $_headers = array();
    
    /**
     * Konstruieren des To-Parts
     *
     * @return String
     */
    protected function _getTo() {
        return implode( ', ', $this->_to );
    }
    
    // ...

    /**
     * Füge Empfänger hinzu, gibt Referenz auf $this für Fluent Interface zurück.
     *
     * @param String $mail
     * @param String $name
     * @return Mail_Abstract
     */
    protected function addRecipient( $mail, $name = null ) {
        // Wenn Adresse gültig ist, füge sie dem Stapel an
        if ( self::isValid( $mail ) ) {
            // ...
        }
        return $this;
    }
    
    /**
     * Gibt zurück, ob eine Adresse valide ist
     *
     * @param String $mail
     * @return boolean
     */
    public static function isValid( $mail ) {
        return 1 === preg_match( "%^pattern$%Ui", $mail );
    }
    
    /**
     * Wird in einer konkreten Klasse überschrieben und dient der entsprechenden Deklaration, wie gesendet wird
     * Da SMTP zB anders funktioniert als die PHP-interne mail() Funktion, lassen wir es an dieser stelle abstrakt.
     * 
     * --> Polymorphie
     */
    abstract public function send();
    
}

class Mail extends Mail_Abstract {
    
    /**
     * Konstruiere weitere Header
     *
     * @return String
     */
    protected function _getHeaders() {
        $string = "From: {$this->_from}\n\r";
        // ...
        return $string;
    }
    
    /**
     * Überschriebene send() Methode
     *
     * @return boolean
     */
    public function send() {
        return mail( $this->_getTo(), $this->_subject, $this->_message, $this->_getHeaders() );
    }
    
}

Aufruf in diesem Fall über das flüchtige Interface zB:
PHP:
$mail = new Mail()
     ->addTo( "foo", "bar" )
     ->addTo( "bla" )
     ->addSubject( "test" )
     ->addMessage( "..." )
     ->send();

Sehr unvollständig und trivial, sollte aber in etwa die Funktionalität darstellen können.
Der Zwang zu verstehen, was OOP ist, lohnt sich nicht. Es ist nur ein Paradigma von vielen, und auch nur eine Möglichkeit von vielen. So lange man nicht selbst auf die Idee der Kapselung kommt, kann man auch die OOP nicht verinnerlichen, denn dann wird es in der Tat nur eine Sammlung von vielen statischen Methoden oder eine zu spezielle Abbildung und Ansammlung dynamischer Methoden.
 
Zuletzt bearbeitet:
okay...
vielen dank! ich glaub ich habs jetzt mehr oder weniger verstanden... werde es einfach mal ausprobieren und gucken was rauskommt... :D
 
Hi,

ich kann das Problem von ms92 sehr gut nachvollziehen, auch ich habe mich sehr lange gefragt, wo denn wirklich der Vorteil von OOP ist. Ab diesem Punkt werden gute Tutorials auch wirklich rar, da viele Programmierer ihre eigenen Techniken anscheinend selbst nicht richtig erklären können. Viel zu oft kommt dann nur die Erklärung der Syntax mit irgendwelchem FooBar-Blödsinn dabei heraus.

Ich persönlich würde drei Vorteile nennen, die man schnell nachvollziehen kann:
- Man kann Klassen durch andere Klassen extenden, also erweitern. Das bedeutet, du musst wesentlich seltener eine Funktion (bzw. Methode) zweimal schreiben, nur weil du eine kleine Änderung hast oder sie erweitern willst.
- Im Gegensatz zum prozeduralen Programmieren musst du dich weniger mit Rückgabewerten rumplagen. Du bekommst einen Wert, wenn du ihn wirklich brauchst und nicht nur, weil du das Ergebnis von Funktion1 zu Funktion2 schubsen musst. Zwischenergebnisse können ja im Objekt gehalten werden.
- Es ist schlicht übersichtlicher, in gewisser Weise "semantischer" alle Funktionalitäten zu einer Problemlösung in einer Klasse unterzubringen. Man muss weniger aufpassen bei den Namenskonventionen, denn es gibt ja automatisch eine gewisse Hierarchie, die etwas mehr Übersicht schafft. Dadurch wird der Code wesentlich ansehnlicher, vor allem wenn jemand anderes ihn sich anschauen muss. ;)

Mich hat das Verarbeiten/Speichern hochgeladener Bilder für OOP begeistert. Da kommt schnell wirklich viel Code zusammen, man muss viele Eventualitäten abdecken. Packt man das ganze schlau in eine Klasse, lässt es sich jedesmal mit drei, vier Zeilen abhandeln und der Code sieht einfach sexy aus. :D


Gruß

.:lay-z-cow:.
 

Neue Beiträge

Zurück