Gerhard: Methoden in Klasse inkludieren

Beitrag lesen

Hallo,

ich mache die ersten Gehversuche OOP unter PHP. Um zu testen, ob ich für dieselbe Klasse Objekte mit unterschiedlichen Methoden generieren kann, habe ich ein kleines Beispiel geschrieben. Offensichtlich geht es aber nicht, da die Funktionen, die als Methoden eingebunden werden sollen, als Funktionen im globalen Kontext eingebunden werden.

----

kunde.php

<?php

class kunde
{
    var $name;

function kunde($name, $geschlecht)
    {
        if ($geschlecht == "m")
        {
            $include="kunde_m.php";
        }
        if ($geschlecht == "w")
        {
            $include="kunde_w.php";
        }
        $this->name = $name;
        include_once($include);
    }

}

$max = new kunde("Max", "m");
test_m();  // globale Einbindung, deswegen funktioniert es
$max->print_kunde();  // globale Einbindung, deswegen im Objekt unbekannt

$sandra = new kunde("Sandra", "w");
test_w();
$sandra->print_kunde();

?>

----

kunde_m.php

<?php

function print_kunde()
{
    echo "Ihr Name ist " . $this->name . ". Sie sind männlich.<br>";
}

function test_m()
{echo "Global eingebunden! => m";}

?>

----

kunde_w.php

<?php

function print_kunde()
{
    echo "Ihr Name ist " . $this->name . ". Sie sind weiblich.<br>";
}

function test_m()
{echo "Global eingebunden! => w";}

?>

----

Das führt zur Ausgabe

Global eingebunden! => m
Fatal error: Call to undefined method kunde::print_kunde() ...

Ich habe eine Lösung gefunden, mit einem innerhalb einer Superklasse erzeugten DAO das Problem zu umgehen. Im Beispiel würden demnach die Methoden der Module als eigene Klassen kunde_m und kunde_w definiert, und der Konstruktor von kunde würde je nach Aufruf diese Klassen als Objekt zurückgeben. Erzeugt würden die Objekte mit

$max = kunde::dao('Max', 'm');
$sandra = kunde::dao('Sandra', 'w');

Dieses Vorgehen ist zwar besser, als alle Methoden in einer Klasse Kunde einzubinden, weil jeweils für ein Objekt nur die Eigenschaften und Methoden der selektierten Unterklasse eingebunden werden, aber zumindest einmal muß der Code aller Unterklassen als Klassenschablone in den Speicher geladen werden. Würde das gepostete Muster mit include funktionieren, wäre der Speicherbedarf niedriger, weil nur die wirklich benötigten Methoden geladen würden.

Gibt es eine Möglichkeit, das mit PHP zu erreichen? Vererbung mittels "extends" entfällt per se, weil es 1. nicht gewünscht ist und 2. zum selben Overhead wie der Weg mit dem DAO führt.