Klasse 3 soll Klasse 2 UND 1 erben

Irgendjemand_1

Erfahrenes Mitglied
Hallo.
Ich habe das Problem, dass ich nicht weiß, wie ich 2 Klassen an eine andere vererben kann.
Also zB sowas:
PHP:
class eins { /* ... */ }
class zwei { /* ... */ }
class drei extends eins extends zwei { /* Hat alle Eigenschaften/Funktionen beider Klassen */ }
Hat jemand eine Ahnung, wie das geht? Auf diese Weise gibt es einen Parse Error (unexpected T_EXTENDS)
 
ÄHm ist das nicht Stichwort für Class Nesting?!

Also kann ja auch falsch liegen aber ich würde das ganze über Class NEsting regeln ;-)

MFG Niels
 
Hallo,

die in diesem Artikel vorgestellte Methode ist allerdings nicht recht sinnvoll (vielleicht ist auch nur das Beispiel schlecht gewählt). Warum sollte die Gästebuch-Klasse das Datenbank-Objekt instantiieren bzw. überhaupt das Wissen besitzen, wie dieses instantiiert werden muss? Das kann dieser Klasse eigentlich ziemlich egal sein. Sie muss nur wissen, wie sie mit einem Datenbank-Objekt umgehen kann. Daher fände ich es logischer, das Datenbank-Objekt an anderer Stelle zu erzeugen und dem Gästebuch-Objekt eine Referenz darauf zu übergeben.

Außerdem ist der Begriff „Class Nesting“ irreführend. Damit wird eigentlich eine Klassendefinition innerhalb einer anderen Klassendefinition gemeint. Das ist in PHP aber nicht möglich:
PHP:
class Foo {
	function test() {
		class Bar { # => Fatal error:  Class declarations may not be nested
		}
	}
}

Aber um jetzt mal zu einer möglichen Lösung des Problems zu kommen: Mehrfachvererbung wird von PHP nicht unterstützt. Als „Ausweichmöglichkeit“ bleiben dir Interfaces (ab PHP5) oder Komposition statt Vererbung. Wie die Umsetzung jeweils aussehen würde, hängt ganz von deinem Klassenmodell ab.

Grüße,
Matthias
 
Also mit dem Beispeil was dort geschildert wird komme ich eigentlich sehr gut zurecht.

So habe ich zum Beispiel eine Art Hauptklasse:

-Mysql
-Mail
-Ftp
-Image
-BBCode
-Pagnitation
-usw.

Und diese Binde ich dann in die Klasse die diese Klassen brauchen ein, zb.:

-GB ----> Mysql, Mail, BBCode, Pagnitation...

Ich weiß net wie man es sonst machen sollte und so wie ich es jetzt mache ist es sehr übersichtlich und außerdem sehr Ressourcensparend.....meine Scripte laufen immer noch recht schnell....

Aber wenn ich mich irre oder einen fatalen Fehler mache so kläre mich auf denn ich bin auch nur ein Mensch der grade erst anfängt mit Programmieren :)

MFG Niels
 
Hallo,

Also mit dem Beispeil was dort geschildert wird komme ich eigentlich sehr gut zurecht.

So habe ich zum Beispiel eine Art Hauptklasse:

-Mysql
-Mail
-Ftp
-Image
-BBCode
-Pagnitation
-usw.

Und diese Binde ich dann in die Klasse die diese Klassen brauchen ein, zb.:

-GB ----> Mysql, Mail, BBCode, Pagnitation...

Ich weiß net wie man es sonst machen sollte und so wie ich es jetzt mache ist es sehr übersichtlich und außerdem sehr Ressourcensparend.....meine Scripte laufen immer noch recht schnell....

Aber wenn ich mich irre oder einen fatalen Fehler mache so kläre mich auf denn ich bin auch nur ein Mensch der grade erst anfängt mit Programmieren :)

MFG Niels

Ich hatte heute mit einem ähnlichen Problem zu tun, da ich mehrere Klassen habe, die Datenbankzugriff brauchen, ich aber vermeiden wollte, dass jede Klasse ein eigenes Datenbank-Objekt erzeugt. Dabei habe ich die Begriffe Singleton Pattern (deutsch: Einzelstück Entwurfsmuster) und Registry Pattern kennen gelernt.
Der Zweck von Singleton Pattern ist es sicher zu stellen, dass nur eine Instanz einer Klasse erzeugt wird, welche dann global erreichbar ist. Registry Pattern werden zur Verwaltung von Instanzen eingesetzt.

Ein Anwendungsbeispiel:
PHP:
/* Registry.class.php - verwaltet erzeugte Instanzen */
class Registry {

    private $store = array();
    static private $thisInstance = null;

    private function __construct() {
    }

    // Singleton Pattern stellt sicher, dass nur eine Instanz der Registry-Klasse erzeugt wird
    static public function getInstance() {
        if (self::$thisInstance == null) {
            self::$thisInstance = new Registry();
        }
        return self::$thisInstance;
    }

    public function register($label, $object) {
        if (!isset($this->store[$label])) {
            $this->store[$label] = $object;
        }
    }

    public function unregister($label) {
        if (isset($this->store[$label])) {
            unset($this->store[$label]);
        }
    }

    public function get($label) {
        if (isset($this->store[$label])) {
            return $this->store[$label];
        }
        return false;
    }

    public function has($label) {
        if (isset($this->store[$label])) {
            return true;
        }
        return false;
    }
}


/* index.php: */

// Einbindung der benötigten Dateien
[...]
require_once 'Registry.class.php';

// globale Objekte instanziieren...
$dsn = array(
    'phptype'        => 'mysql',
    'username'        => $dbuser,
    'password'        => $dbpass,
    'hostspec'        => $dbhost,
    'database'        => $dbname
);
$db =& DB::connect($dsn);
if (DB::isError($db)) {
    die($db->getMessage());
}
$db->setFetchMode(DB_FETCHMODE_ASSOC);

$tpl = new Smarty;
$tpl->template_dir = './templates';
$tpl->compile_dir = './templates/tmp';
$tpl->force_compile = true;

// ...und registrieren
$registry = Registry::getInstance();
$registry->register('database', $db);
$registry->register('smarty', $tpl);

$gbook = new Guestbook(...);

[...]


/* Guestbook.class.php: */
class Guestbook {

	var $db;
	var $tpl;

	function Guestbook(...) {
        // Zugriff auf DB- und Template-Objekt über globale Registry-Instanz
		$registry = Registry::getInstance();
        // ggf. mit has-Methode Verfügbarkeit überprüfen
		$this->db  = $registry->get('database');
		$this->tpl = $registry->get('smarty');
	}

        [...]

}

Ich hatte noch nicht viel Zeit, damit zu arbeiten, da ich heute das erste Mal damit in Kontakt gekommen bin, aber bisher finde ich diese Handhabung von Objekten, die in mehreren Klassen Verwendung finden, sehr praktisch und übersichtlich.

Gruß
Marvin
 
Gibt es denn dazu ein Tutorials oder haste nen Link wo du das her hast....weil würde mir das gerne mal genauer ansehn und druchlesen.

Dann noch ne Frage.

Was ist denn das Problem daran, wenn jede Klasse seine eigene Mysql Instanz hat?

MFG Niels
 
Zurück