Discussion:
Funktionen einer Klasse in andere Datei auslagern
(zu alt für eine Antwort)
Klaus Herzberg
2006-05-15 09:46:30 UTC
Permalink
Hallo,
ich habe eine Klasse, die so viel Quelltext hat, dass ich Teile davon
gerne in andere Dateien auslagern moechte.

Momentan faellt mir nur ein, diese Funktionen in andere Klassen
auszulagern und dann ueber "extends" einzubinden.

Gibt es eventuell eine andere Moeglichkeit?

Eigentlich geht es also darum, nur den Quelltext auszulagern.

mfg. klaus.
Mario Rasser
2006-05-15 12:48:16 UTC
Permalink
Post by Klaus Herzberg
Hallo,
Hallo Klaus,
Post by Klaus Herzberg
ich habe eine Klasse, die so viel Quelltext hat, dass ich Teile davon
gerne in andere Dateien auslagern moechte.
(1) Vielleicht OO-Konzept überprüfen??
Post by Klaus Herzberg
Momentan faellt mir nur ein, diese Funktionen in andere Klassen
auszulagern und dann ueber "extends" einzubinden.
(2) Sollte man sowieso überlegen siehe (1)
Post by Klaus Herzberg
Gibt es eventuell eine andere Moeglichkeit?
(3) Etwa so (class.php):

<?php

class ichbingross {

function foo($val) {
require('class_func_foo.php');
}
}

$o = new ichbingross;
$o->foo("Hallo");
//Output:
//Hallo
//ichbingross
?>

class_func_foo.php:
-------------------
<?php
/* Quelltext der Funktion ichbingross::foo($val)*/
echo $val."\n";
echo get_class($this);
?>
Post by Klaus Herzberg
Eigentlich geht es also darum, nur den Quelltext auszulagern.
siehe [1]

[1] http://de.php.net/manual/de/function.require.php

MfG,
Mario
Klaus Herzberg
2006-05-15 13:17:19 UTC
Permalink
Hallo,
erstmal danke fuer die Hinweise.

Eigentlich geht es mir nur darum, dass ein Stueck Quelltext zur Laufzeit
an einer bestimmten Stelle eingebunden wird, als wuerde er an dieser
Stelle in der Datei normal stehen.

mfg. klaus.
Johannes Mueller
2006-05-15 13:19:42 UTC
Permalink
Post by Klaus Herzberg
Eigentlich geht es mir nur darum, dass ein Stueck Quelltext zur
Laufzeit an einer bestimmten Stelle eingebunden wird, als wuerde er
an dieser Stelle in der Datei normal stehen.
Hilft dir vielleicht:

include()
include_once()
require()
require_once()

http://www.php.net

Grüße
Johannes
--
Emails ohne "[nospam]" im Betreff werden kommentarlos gelöscht.
Klaus Herzberg
2006-05-15 13:26:25 UTC
Permalink
Hallo,
Post by Johannes Mueller
Post by Klaus Herzberg
Eigentlich geht es mir nur darum, dass ein Stueck Quelltext zur
Laufzeit an einer bestimmten Stelle eingebunden wird, als wuerde er
an dieser Stelle in der Datei normal stehen.
include()
include_once()
require()
require_once()
leider nicht. Denn:

class test
{
function1()
{
}
function2()
{
}
}

Und nun moechte ich einfach den Quelltext

function1()
{
}
function2()
{
}

auslagern in eine Datei. Ohne den Quelltext veraendern zu muessen.
Ich erinnere mich, bei C gab es doch irgendwie Module. Da wurde vor dem
Compilieren der Quelltext an der angegebenen Stelle eingefuegt, als
waere er dort geschrieben worden.

mfg. klaus.
Mario Rasser
2006-05-15 13:50:41 UTC
Permalink
Post by Klaus Herzberg
Hallo,
Hallo Klaus,
[1]:
----
Post by Klaus Herzberg
Post by Johannes Mueller
include()
include_once()
require()
require_once()
und warum hilft das nicht?

siehe mein vorheriges Posting Pkt. 3, das macht genau das was du
beschreibst.

(1) eine grosse Klasse mit zuviel Quellcode in der Datei
(2) Funktionsquellcode ausgelagert
(3) Funktionsquellcode via require an der Stelle eingebunden wo er
benötigt wird
Post by Klaus Herzberg
auslagern in eine Datei. Ohne den Quelltext veraendern zu muessen.
Ich erinnere mich, bei C gab es doch irgendwie Module. Da wurde vor dem
Compilieren der Quelltext an der angegebenen Stelle eingefuegt, als
waere er dort geschrieben worden.
Der Interpreter fügt den Quellcode doch bei den Anweisungen (siehe [1]) ein.
Ganz ohne Änderung des Quellcode (require & co. einfügen) wird das wohl
nichts werden oder hat dein PHP-Interpreter (und auch dein C-Compiler)
eine Glaskugel?

So On,
Mario
Klaus Herzberg
2006-05-15 14:26:59 UTC
Permalink
Post by Mario Rasser
Post by Klaus Herzberg
Hallo,
Hallo Klaus,
----
Post by Klaus Herzberg
Post by Johannes Mueller
include()
include_once()
require()
require_once()
und warum hilft das nicht?
weil, wenn ich Deinen Quelltext richtig verstehe, ich dies fuer jede
Funktion einzeln erledigen muss.

mfg. klaus.
Mario Rasser
2006-05-15 15:09:37 UTC
Permalink
Klaus Herzberg schrieb:
Hallo,
Post by Klaus Herzberg
weil, wenn ich Deinen Quelltext richtig verstehe, ich dies fuer jede
Funktion einzeln erledigen muss.
Ja, anderes hast du IMHO keine Chance (außer OO-Konzept überdenken,
wobei du da auch an den Quelltext musst).

Da es sich bei PHP (Hypertext Preprocessor) um einen Präprozessor
handelt, der einen gültige Syntax erwartet (z.B. function a($par) in
einer Klassendefinition). Der C-Compiler benutzt vorher einen
Präprozessor, der via #include (Präprozessor-Direktive) den Quelltext
quasi an die Stelle kopiert, danach kommt ja erst der Compiler, welcher
von dem Einfügen nichts mitbekommen hat. Bei PHP kann das IMHO also so
wie du es willst nicht funktionieren. Da die Syntax einen Funktionskopf,
ein Attribut oder <leer> in einer Klassenanweisung erwartet und nicht
ein "binde_ein" (also include & co.).

Nur so am Rande:
----------------

//Wenn ich richtig kappiert habe willst du das hier:
<PSEUDOCODE>
klasse bingross {
binde_ein("meine_attribute.php");
binde_ein("funktion_a_bis_l.php");
binde_ein("funktion_l_bis_z.php");
}
</PSEUDOCODE>

Ist aber ganz schlecht von anderen lesbar und wie du bemerkt hast nicht
mit include & co realisierbar.

Hingegen:
---------

<PSEUDOCODE>
klasse bingross {

var $a;
var $b;
funktion a ($parameter1) {
binde_ein("funktionskoerper_a.php");
}
function b ($parameter2) {
binde_ein("funktionskoerper_b.php");
}
}
</PSEUDOCODE>

So kennt jeder die Signaturen der Funktionen und somit auch die Methoden
der Klasse und weiß was er benutzen muss. (Vorausgesetzt die Funktion
heißt nicht a() und b() ;-)

MfG,
Mario
Markus Malkusch
2006-05-15 17:56:49 UTC
Permalink
Post by Klaus Herzberg
weil, wenn ich Deinen Quelltext richtig verstehe, ich dies fuer jede
Funktion einzeln erledigen muss.
Naja man kann das beliebig häßlich machen:

require_once 'MethodsA.php';
require_once 'MethodsB.php';
class LangeKlasse {


public function bla() {
A::bla();
}


public function blub() {
A::blub();
}


public function blib() {
B::blib();
}


}
--
http://hommingberger-gepardenforelle.malkusch.de/
Andreas Korthaus
2006-05-15 14:54:19 UTC
Permalink
Hallo Klaus!
Post by Klaus Herzberg
ich habe eine Klasse, die so viel Quelltext hat, dass ich Teile davon
gerne in andere Dateien auslagern moechte.
Warum möchtest Du das? Wieviel ist denn bei Dir "viel" Quelltext?

Wenn die Klasse oder die Methoden zu viel machen, könnte man das Design
per Refactoring verbessern.

Aber manchmal sind auch gut konstruierte Klassen/Methoden etwas länger.
Wenn Dir der Code im Editor einfach nur zu unübersichtlich wird,
könntest Du Dir einen Editor/IDE zulegen, der Code-Folding unterstützt -
der also Methoden ausblenden kann. Zusammen mit Auto-Complete Features
und Integration von phpdoc Kommentaren kann man in meinen Augen
erheblich effizienter mit komplexeren Klassen/Methoden arbeiten.

Wenn es Dir um Performance geht, verwende PHP als Apache Modul oder
Lighttpd/FastCGI und einen opcode-cache wie PECL::APC. Dann wird die
Klasse komplett als Opcode im RAM gehalten.
Post by Klaus Herzberg
Momentan faellt mir nur ein, diese Funktionen in andere Klassen
auszulagern und dann ueber "extends" einzubinden.
Das macht nur bei "ist ein" Beziehungen Sinn. Wenn Du nur die Klasse
künstlich kürzen willst, würde ich das nicht machen. Das ist später
schwer nachzuvollziehen, erschwert die Pflege...
Post by Klaus Herzberg
Eigentlich geht es also darum, nur den Quelltext auszulagern.
Die Frage ist - warum? Der Quelltext wird unterm Strich komplexer und
langsamer. Wenn es wirklich nur um die Darstellung im Editor geht ->
Code Folding.

Wenn immer nur ein kleiner Teil der Klasse benötigt wird, würde ich über
ein Refactoring nachdenken, vielleicht kann man spezialisierte Teile in
Treiber/Plugins auslagern, wie z.B. bei DB-spezifischen Treibern
typischer DB Abstraktions-Klassen. Oder vielleicht kannst Du die Klasse
in mehrere kleine aber vor allem sinnvolle(!) Klassen aufteilen...


Grüße
Andreas
Hartmut Holzgraefe
2006-05-16 11:10:43 UTC
Permalink
Post by Klaus Herzberg
Hallo,
ich habe eine Klasse, die so viel Quelltext hat, dass ich Teile davon
gerne in andere Dateien auslagern moechte.
eine Klasse muss innerhalb einer "compile unit" vollständig
definiert werden, deshalb ist ein include von Code aus anderen
Dateien (anders als zB. in C++) leider nicht möglich.
--
Hartmut Holzgraefe, Senior Support Engineer .
MySQL AB, www.mysql.com

http://www.mysql.com/support/
Klaus Herzberg
2006-05-16 12:05:05 UTC
Permalink
Hallo,
vielen Dank fuer die Hinweise und Anregungen.

mfg. klaus.

Loading...