PHP und Klassen

dragon001

New Member
Ist es eigentlich möglich, Klassen nicht per Extend zu erweitern, sondern funktionen im Afruf nachzuladen.

Verwende bisher im Kern meiner Applikationen ein Aufrufsystem, welches Funktionen in den Kern lädt.

Beispiel:
PHP:
#Globale Module
	$casedir = dir(system_server_directory.Core_Folder_glob);
	while($func=$casedir->read()) {
	$sypli=explode(".",$func);
	if($sypli[1]=="glob")
	{
	include_once(system_server_directory.Core_Folder_glob.$func);
		if (CORE_debug_mode == true) {
	    	$debug	.=Core_Folder_glob.$func."<br>";
	}
	}
	}
	closedir($casedir->handle);

Dies ist ein teil meines CMS.
Ich will für kommende Applikationen das Ganze Object Orientiert umsetzen.
Hintergrund:
Die Module benötigen teilweise Funktionen ,welche auch von anderen Modulen aufgerufen werden können.
Damit ist eine gewisse Modularität des Kern entstanden.
Wie die Zeit es jedoch will, möchte ich das Ganze als Objekt umstellen.
In diesem Objekt sollen neben den Kern Funktionen auch die Datenbank Schnittstelle, Template Engine und diverse andere Schnittstellen integriert werden.
Gibt es die Möglichkeit funktionen innerhalb einer Klasse per Include nachzuladen.

Zum Beispiel:

PHP:
class foo
{
	var $good;
	function foo($str='')
	{
		$this->good = $str;
	}
             include_once(library."file.function.php");

}
Hat da jemand Erfahrung?

:(
 
Hallo!

Soweit ich mich erinnern kann, ist das, was Du da vorhast, nicht möglich.
Aber folgender Code geht:

PHP:
class foo
{
    var $good;
    function foo($str='')
    {
        $this->good = $str;
    }
    function meinefunc() 
    {
        include_once(library."file.function.php");
    }

}


Was Du suchst, ist ein "Overloading" von Klassen (geht nur in PHP5)...

zB so:
PHP:
class AA {
	var $BB;
	function CC() {
		// "Normale" Methode
		$this->BB = "CC";
		echo $this->BB;
	}
	function __call($m,$a) {
		// Für alle unbekannten Methoden
		echo "Die nicht bekannte Methode $m wurde aufgerufen...";
		// Da gibts dann eine Datei im gleichen Verzeichnis, die genauso heisst, wie
		// die gewünschte Methode
		require_once("./".$m.".php");
	}
	
}

// Mal eine Objekt $Obj erzeugen
$Obj = new AA;
// "Normale" Methode
$Obj->CC();
// Die gibts nicht so in der Klasse - wohl aber in der Datei "DD.php"
$Obj->DD();

Und es gibt dann halt noch eine andere Datei namens "DD.php" im gleichen Verzeichnis, zB:

PHP:
<?php
	$this->BB = "DD";
	echo $this->BB;
?>

Als Ergebnis kommt dann raus:

Code:
CCDie nicht bekannte Methode DD wurde aufgerufen...DD

Guggst Du hier:

http://de2.php.net/manual/de/language.oop5.overloading.php
 
Hm, was meinst du genau? Funktionen von Instanzen anderer Klassen aufrufen? Das ginge, indem du der Klasse entweder beim Erstellen (Konstruktor) oder sonstwie eine Referenz auf die andere Klasse übergibst.
Bsp.:
PHP:
class A {
  function foo() {
    print "A::foo()\n";
  }
}
class B {
  var $a;
  function B(&$a) {
    $this->b = &$a;
  }
  function check() {
    $this->b->foo();
  }
}
$a = new A();
$b = new B(&$a);
$b->check();
So sollte es klappen.. Mit den Referenzen musst du aber aufpassen, in PHP4 werden die sonst plötzlich aufgelöst und du hast eine Kopie statt einer Referenz, was erstens höheren Speicherbedarf bedeutet und zweitens oft zu Problemen führt. In PHP5 ginge es wohl auch einfacher.
 
Nicht so.
Ziel des ganzen soll es sein, das der kern über drei feste funktionen verfügt und der rest bei verwendung hinzugefügt wird.
Beispiel:

Funktionen welche nur für User gedacht sind, und welche für Admins von einander abzuschotten.
Bisher wird das ganze halt über nen aufruf getätigt, ob der Benutzer Admin ist (bzw. User).

Ich hab zwar eine PlugIn Klasse mal auf http://www.phpclasses.org/ gefunden, doch ist die Verwendung für mich zu komplex und undurchsichtig.

Die Schnittstelle, und das war oder ist das Ziel, soll modular erweiterbar sein, ohne an alzu viel festen code (bis auf die Core Settings, die Autentifizierungsroutinen und den sql/template Engine code) gebunden sein.
Sodas Code von dritten sich leicht integrieren läßt. Beispielsweise, Mailbibliothek.

Das ganze jedesmal per extends laufen zu lassen, ist zu aufwändig.

Was mich im Moment an einigen meiner Projekte stört ist der fakt das ich 3 - 5 Objekte hab. (SQL, Template, File Access, Mail, FTP).
Das würd ich halt gern, recoursen mässig gesehen auf eine kombinieren.
 
Last edited by a moderator:
Wenn ich Dich richtig verstehe, dann willst Du einem Objekt fallweise bestimmte Methoden "dynamisch", d.h. wenn benötigt, zufügen?! Und: diese Methoden sollen u.U. auch anderen Objekten fallweise zur Verfügung stehen?! Und: diese Methoden sollen einfach erweiterbar sein, d.h. neue Methoden hinzufügen soll schnell und einfach gehen?! Dann ist das "Overloading" wohl das richtige, da in der Klasse nicht festgelegt wird, welche Methoden es gibt (alle unbekannten werden über die __call-Methode abgefangen). Für jede "unbekannte" Methode wird dann der PHP-Code aus einer entsprechenden Datei nachgeladen. Die Methode DD aus obigem Beispiel kannst Du also auch noch in anderen Klassen (bzw. Objekten) verwenden.
 
So in der Art.
Meine Frage, die noch offensteht, ist __call Methode auch in PHP4 gültig oder werden damit meine Projekte nur noch für PHP5 kompatibel sein.
PHP4 wär mir wichtig, da nicht alle Kunden von meinen Servern betreut werden.
 
Das heißt mit overload läßt sich eine klasse dynamisch um weitere klassen funktionen erweitern oder?

Das heißt aber auch das ich den Kern in einer PHP5 Version und PHP4 Version aufbauen muß oder einfach die PHP Version auslese und beide KlassenOverloads in einem Kern Initaufruf unterbring(natürlich nach den Versionen unterschieden (4.3>5.0>5.x)
 
dragon001 said:
Das heißt mit overload läßt sich eine klasse dynamisch um weitere klassen funktionen erweitern oder?
Genau so isses.

dragon001 said:
Das heißt aber auch das ich den Kern in einer PHP5 Version und PHP4 Version aufbauen muß oder einfach die PHP Version auslese und beide KlassenOverloads in einem Kern Initaufruf unterbring(natürlich nach den Versionen unterschieden (4.3>5.0>5.x)
Ich befürchte schon. Wenn Du wirklich "noch" auf PHP4 entwickeln willst. In absehbarer Zeit hat sich das sowieso erledigt :) Meine persönliche Empfehlung ist ja Ruby on Rails (geht kaum mehr OO... check http://www.rubyonrails.com) - Bohlen würde sagen: "Hammermähsisch" :D
 
Back
Top