Functionsdefinition in Functionsdefinition & guter Stil?
Functionsdefinition in Functionsdefinition & guter Stil?
am 20.06.2006 11:24:51 von Thomas Grabietz
Hallo Alle,
ich habe gerade gesehen, dass mein PHP 5.1.2 folgende Konstruktion warning-
und errorfrei interpretiert:
function test()
{
function sub()
{
print "hello world";
}
sub();
}
test();
//Ausgabe: hello world
Ist dergleichen in anderen C-orientieren Sprachen nicht
eine "unverzeihlicher" Fehler.
Mal abgesehen davon frage ich mich, ob es guter Stil ist, so etwas zu
programmieren.
Letztendlich suche ich nach einer sauberen Möglichkeit Seiten in andere zu
includieren. Bei einem:
function render_site()
{
include("egal.php");
}
Weià ich nicht welche Variablen egal in meiner function einführt oder gar
überschreibt.
function render_site()
{
include("egal.php");
$content=egal();
}
sieht erstmal besser aus, führt aber zu genau so einer Konstruktion wie
oben.
include("egal.php");
function render_site()
{
$content=egal();
}
Wäre natürlich sauberer, was ist aber, wenn der die Seite die in function
render_site() eingebunden wird (wie so oft) dynamisch ausgewählt wird.
Kennt oder hat jemand Meinungen, Artikel oder sonstiges dazu?
Gruà Tom
Re: Functionsdefinition in Functionsdefinition & guter Stil?
am 20.06.2006 11:51:55 von Ulf Kadner
Thomas Grabietz wrote:
> Hallo Alle,
> ich habe gerade gesehen, dass mein PHP 5.1.2 folgende Konstruktion warning-
> und errorfrei interpretiert:
>
> function test()
> {
> function sub()
> {
> print "hello world";
> }
> sub();
> }
>
> test();
Ja, das ist eine private/interne Funktion.
http://www.php.net/manual/en/language.functions.php
> Ist dergleichen in anderen C-orientieren Sprachen nicht
> eine "unverzeihlicher" Fehler.
Andere C-Orientierte Sprachen? Was hat PHP dem mit C zu tun, ausser das
es in C geschrieben ist? Viel isses nicht!
> Mal abgesehen davon frage ich mich, ob es guter Stil ist, so etwas zu
> programmieren.
Warum nicht. Das kommt immer auf die Sprachdefinition an. In C#, PHP und
anderenen Sprachen gibts sogar interne Klassen.
Ich persöhnlich empfinde es als Feature. Da kann man nur in der Funktion
wiederkehrenden mehrmal benötigten Code bequem zusammen fassen.
Ausserdem ist die interne Funktion automatisch private, was je nach
Anwendungsfall durchaus sinnvol ist.
> Letztendlich suche ich nach einer sauberen Möglichkeit Seiten in andere zu
> includieren. Bei einem:
>
> function render_site()
> {
> include("egal.php");
> }
Das Konstrukt hat aber wirklich keinerlei Sinn!
> Weià ich nicht welche Variablen egal in meiner function einführt oder gar
> überschreibt.
Was bedeutet dieser Satz?
> function render_site()
> {
> include("egal.php");
> $content=egal();
> }
>
>
> sieht erstmal besser aus, führt aber zu genau so einer Konstruktion wie
> oben.
>
> include("egal.php");
> function render_site()
> {
> $content=egal();
> }
>
> Wäre natürlich sauberer, was ist aber, wenn der die Seite die in function
> render_site() eingebunden wird (wie so oft) dynamisch ausgewählt wird.
Ich verstehe in keiner Weise was Du sagen willst. Was haben Deine
Ausführungen mit internen Funktionen zu tun?
MfG, Ulf
Re: Functionsdefinition in Functionsdefinition & guter Stil?
am 20.06.2006 14:17:03 von Thomas Grabietz
Ulf Kadner wrote:
Danke für die Auskunft es ist genau das was mir gefehlt hat, wenn ich auch
die leicht schroffe Art nicht ganz verstehe, ich dachte man könnte in einer
Newsgroup über so etwas diskutieren (oder fragen)...
Deshalb noch ein paar Kommentare
> Thomas Grabietz wrote:
>
>> Hallo Alle,
>> ich habe gerade gesehen, dass mein PHP 5.1.2 folgende Konstruktion
>> warning- und errorfrei interpretiert:
>>
>> function test()
>> {
>> function sub()
>> {
>> print "hello world";
>> }
>> sub();
>> }
>>
>> test();
>
> Ja, das ist eine private/interne Funktion.
> http://www.php.net/manual/en/language.functions.php
>
>> Ist dergleichen in anderen C-orientieren Sprachen nicht
>> eine "unverzeihlicher" Fehler.
>
> Andere C-Orientierte Sprachen? Was hat PHP dem mit C zu tun, ausser das
> es in C geschrieben ist? Viel isses nicht!
>
>> Mal abgesehen davon frage ich mich, ob es guter Stil ist, so etwas zu
>> programmieren.
>
> Warum nicht. Das kommt immer auf die Sprachdefinition an. In C#, PHP und
> anderenen Sprachen gibts sogar interne Klassen.
>
> Ich persöhnlich empfinde es als Feature. Da kann man nur in der Funktion
> wiederkehrenden mehrmal benötigten Code bequem zusammen fassen.
> Ausserdem ist die interne Funktion automatisch private, was je nach
> Anwendungsfall durchaus sinnvol ist.
Darüber war ich mir nicht im Klaren, deswegen habe ich ja nachgefragt! Ich
denke aber genau so wie du, dass es sich genau in dem Fall s.u. sinnvoll
einsetzen lässt.
>
>> Letztendlich suche ich nach einer sauberen Möglichkeit Seiten in andere
>> zu includieren. Bei einem:
>>
>> function render_site()
>> {
>> include("egal.php");
>> }
>
> Das Konstrukt hat aber wirklich keinerlei Sinn!
>
>> Weià ich nicht welche Variablen egal in meiner function einführt oder gar
>> überschreibt.
>
> Was bedeutet dieser Satz?
das jede Variable in egal.php eine vorher definierte Variable der function
render_site überschreiben kann und somit eine schlechte Alternative
darstellt (das Ding macht wirklich keinen Sinn).
>
>> function render_site()
>> {
>> include("egal.php");
>> $content=egal();
>> }
>>
>>
>> sieht erstmal besser aus, führt aber zu genau so einer Konstruktion wie
>> oben.
>>
>> include("egal.php");
>> function render_site()
>> {
>> $content=egal();
>> }
>>
>> Wäre natürlich sauberer, was ist aber, wenn der die Seite die in function
>> render_site() eingebunden wird (wie so oft) dynamisch ausgewählt wird.
>
> Ich verstehe in keiner Weise was Du sagen willst. Was haben Deine
> Ausführungen mit internen Funktionen zu tun?
Ach so: Ich möchte eine Seite ausgeben, in der ich eine gröÃere Anzahl von
Elementen (dynamisch) verschachtele. Dabei verschachtele ich natürlich auch
Funktionen und deren Definitionen, da ich so etwas bisher noch nicht
gemacht habe frage ich hier mal nach. Letzt endlich will ich ja, dass der
Code für mich und vielleicht andere gut lesbar bleibt.
>
> MfG, Tom
Re: Functionsdefinition in Functionsdefinition & guter Stil?
am 20.06.2006 14:38:09 von Ulf Kadner
Thomas Grabietz wrote:
> Danke für die Auskunft es ist genau das was mir gefehlt hat,
freut mich.
> wenn ich auch
> die leicht schroffe Art nicht ganz verstehe,
huh? Ich kann ja mal schroff werden :-)
> ich dachte man könnte in einer
> Newsgroup über so etwas diskutieren (oder fragen)...
Habe ich dich verletzt. Sorry aber ich habe einfach nur geantwortet.
Werds in Zukunft wohl besser lassen.
> Darüber war ich mir nicht im Klaren, deswegen habe ich ja nachgefragt!
Das dachte ich mir. Warum sollte ich Dir sonst obige Antwort geben? ;-)
> Ach so: Ich möchte eine Seite ausgeben, in der ich eine gröÃere Anzahl von
> Elementen (dynamisch) verschachtele.
Dazu nutzt man im allgemeinen eine Templateengine. (z.B.: smarty.php.net
o.A.)
MfG, Ulf
Re: Functionsdefinition in Functionsdefinition & guter Stil?
am 20.06.2006 18:26:05 von daniel.gorski
[Ulf Kadner in de.comp.lang.php.misc]
>In C#, PHP und anderenen Sprachen gibts sogar interne Klassen.
^^^
Für die Nachwelt wollen wir das nicht unkorrigiert stehen lassen: du
meintest sicherlich Java anstatt PHP.
mfg dtg
Re: Functionsdefinition in Functionsdefinition & guter Stil?
am 20.06.2006 20:29:45 von Matthias Wuebbeling
Thomas Grabietz wrote:
> Ach so: Ich möchte eine Seite ausgeben, in der ich eine gröÃere Anzahl von
> Elementen (dynamisch) verschachtele. Dabei verschachtele ich natürlich auch
> Funktionen und deren Definitionen, da ich so etwas bisher noch nicht
> gemacht habe frage ich hier mal nach. Letzt endlich will ich ja, dass der
> Code für mich und vielleicht andere gut lesbar bleibt.
Hmm, dein Vorhaben ist aber sicherlich in keinster Weise gut lesbar.
(Ja, Vermutung). Es gibt (auch in php) Möglichkeiten, Code in Klassen zu
kapseln. Hierbei sollten die Methoden i.d.R. zumindest einen engen Bezug
zueinander haben, wenn du die Klasse als reine Codesammlung willst.
Möchtest du es nicht auf diese Weise machen, so kannst du dir auch
Bibliotheksdateien erstellen, die Funktionen anbieten. Wieso willst du
sie schachteln? Gibt es Funktionen/Methoden, die den gleichen
Funktionsnamen haben und unterschiedliche Dinge bewirken? Dann solltest
du dir das Prinzip deiner Namensgebung nochmal durch den Kopf gehen lassen.
Wenn du das allein für irgendwie geartete Darstellungen brauchst, da hat
dir Ulf schon Smarty empfohlen.
Ansonsten empfehle ich dir mal
10.1. Warum Klassen und Objekte benutzen?
http://www.php-faq.de/q/q-klassen-warum.html
30.1. Was ist PEAR?
http://www.php-faq.de/q/q-pear-was.html
hoffe, ich habe in etwa verstanden, was du möchtest?
Lieben GruÃ,
Matze
Re: Functionsdefinition in Functionsdefinition & guter Stil?
am 20.06.2006 20:46:37 von Ulf Kadner
Daniel T. Gorski wrote:
> [Ulf Kadner in de.comp.lang.php.misc]
>
>
>>In C#, PHP und anderenen Sprachen gibts sogar interne Klassen.
>
> ^^^
> Für die Nachwelt wollen wir das nicht unkorrigiert stehen lassen: du
> meintest sicherlich Java anstatt PHP.
PHP geschrieben und PHyton gedacht. Wenigstens die ersten beiden Zeichen
passen. ;-) Danke fuer den Hinweis!
MfG, Ulf
Re: Functionsdefinition in Functionsdefinition & guter Stil?
am 21.06.2006 22:37:31 von Thomas Grabietz
Matthias Wuebbeling wrote:
>
> hoffe, ich habe in etwa verstanden, was du möchtest?
Danke erst mal für die ausführliche Antwort, vielleicht sollte ich etwas
genauer schreiben weshalb ich diese Frage gestellt habe.
Die Extensionschnittstelle eines sehr bekannten und beliebten CMS bietet mir
eine Klasse an, in die ich eigenen Code reinschreiben kann (kürze das hier
mal ab):
class tx_myextension_pi1 extends tslib_pibase {
function main()
{
return "mynewcontent";
}
}
dieses Plugin kann ich an einer bestimmten Stelle meiner Seite einbauen, es
wird dann immer geladen, wenn die id dieser Seite aufgerufen wird
(index.php?id=0815)
Das Plugin was ich schreibe, besteht aber aus mehreren Unterseiten. Daher
hänge ich die Unterseite die geladen werden soll an die Adresse an:
index.php?id=0815&myPlugin=seite_1
index.php?id=0815&myPlugin=seite_2
ein $hash löst dann die Seiten auf
...
"seite_1"=>"machdies.php"
"seite_2"=>"machdas.php"
So, jetzt fängt die Frage an. Wie organisiere ich machdies.php oder
machdas.php so, dass mein Code gut lesbar ist und keine Variablen
zerschießt und sich gut in die Schnittstelle einfügt.
function main()
{
$meineWichtigsteVar=42;
include ($hash[$_GET['myPlugin']]);
//ist jetzt Kurzform
}
tut mir irgendwie ein bisschen weh! Ich sehe nicht was passiert (zum
Beispiel mit $meineWichtigsteVar) und schachtele möglicherweise Funktionen.
Als ich das gesehen habe, dachte ich daran, dass viele Compiler von Sprachen
die eine C-Ähnliche Syntax haben (formuliere es hier vorsichtiger) so etwas
nicht akzeptieren, was ja sicher auch seinen Grund hat (oder haben könnte).
Die deklaration "global" in funktionen funktioniert bei deren
Verschachtelungen übrigens nicht mehr(logischerweise).
Aus diesem Grund habe ich die Frage hier gestellt (als eine Art
Zwichenfrage). Die eigentliche Frage wäre, wie löse ich so eine Situation
wie oben sauber?
Gruß Tom
Re: Functionsdefinition in Functionsdefinition & guter Stil?
am 21.06.2006 23:23:43 von Matthias Wuebbeling
Thomas Grabietz wrote:
> So, jetzt fängt die Frage an. Wie organisiere ich machdies.php oder
> machdas.php so, dass mein Code gut lesbar ist und keine Variablen
> zerschießt und sich gut in die Schnittstelle einfügt.
So, wie ich dich verstanden habe, hast du als Schnittstelle schon in
Klassen aufgeteilten Code. Was spricht dagegen, dies beizubehalten?
> function main()
> {
> $meineWichtigsteVar=42;
> include ($hash[$_GET['myPlugin']]);
> //ist jetzt Kurzform
> }
> tut mir irgendwie ein bisschen weh! Ich sehe nicht was passiert (zum
> Beispiel mit $meineWichtigsteVar) und schachtele möglicherweise Funktionen.
generell sind Variablen innerhalb von Funktionen in ihrer Gültigkeit bis
zum Ende der Funktion beschränkt. Dies kannst du mit "global" ändern, so
dass du im Funktionskontext Zugriff auf globale Variablen bekommen
kannst, das bestimmst aber du.
> Als ich das gesehen habe, dachte ich daran, dass viele Compiler von Sprachen
> die eine C-Ähnliche Syntax haben (formuliere es hier vorsichtiger) so etwas
> nicht akzeptieren, was ja sicher auch seinen Grund hat (oder haben könnte).
Es gibt auch Sprachen mit inneren Funktionen oder Klassen, auch welche
mit C-Ähnlicher Syntax.
> Die deklaration "global" in funktionen funktioniert bei deren
> Verschachtelungen übrigens nicht mehr(logischerweise).
Da bin ich mir nicht sicher, aber prinzipiell würde ich davon ausgehen,
dass das schon funktioniert.
> Aus diesem Grund habe ich die Frage hier gestellt (als eine Art
> Zwichenfrage). Die eigentliche Frage wäre, wie löse ich so eine Situation
> wie oben sauber?
Mit Klassen?
Die Funktion "main" wird also von deinem CMS-Umbau ausgeführt. Das ist
auch nicht schlimm. Du kannst innerhalb deiner "Unterdateien" Klassen
definieren, die du dann innerhalb der main Funktion instantiierst und
dort meinetwegen die Methode "start" (die natürlich in allen Klassen
existiert) ausführst.
Beispiel:
require_once hash(...);
$objectUnterseite = new Unterseite();
$objectUnterseite->start();
require_once ist in dieser Situation imho besser, als include. Du
bekommst einen Fehler (nicht nur Warning, wie bei include), wenn die
Datei nicht existiert und sie wird maximal einmal eingebunden.
Wenn du nun Funktionen hast, die du allen verschiedenen
Unterseite-Objekten zur Verfügung stellen willst, erstellst du eine
Datei (bspw. lib.php) und schreibst dort diese Funktionen hinein.
Damit hast du eine logische Kapselung nach Unterseiten in deinen
Klassen, Hast "start" in den Objekten als Einsprungspunkt aller
Unterseiten und Libraryfunktionen in einer entsprechenden Datei. Diese
"require_once"d du natürlich in den jeweiligen Unterseiten-Dateien, um
sicherzustellen, dass sie auch eingebunden wird.
Wenn du zusätzlich deine Klassen gut dokumentierst sollte der Code gut
lesbar und verständlich sein.
HTH und lieben Gruß,
Matze
Re: Functionsdefinition in Functionsdefinition & guter Stil?
am 21.06.2006 23:23:44 von Niels Braczek
Thomas Grabietz schrieb:
> Das Plugin was ich schreibe, besteht aber aus mehreren Unterseiten. Dah=
er
> hänge ich die Unterseite die geladen werden soll an die Adresse an:
>=20
> index.php?id=3D0815&myPlugin=3Dseite_1
> index.php?id=3D0815&myPlugin=3Dseite_2
Sind das dann nicht eher mehrere Plugins?
> ein $hash löst dann die Seiten auf=20
> ..
> "seite_1"=3D>"machdies.php"
> "seite_2"=3D>"machdas.php"
> So, jetzt fängt die Frage an. Wie organisiere ich machdies.php oder
> machdas.php so, dass mein Code gut lesbar ist und keine Variablen
> zerschießt und sich gut in die Schnittstelle einfügt.
function main()
{
$hash =3D array(...);
if (!isset($hash[$_GET['myPlugin']])) {
die('Intrusion alert!');
}
$pluginName =3D $hash[$_GET['myPlugin']];
require_once 'path/to/plugins/'.$pluginName.'.php';
$plugin =3D new $pluginName();
$plugin->setImportantVar(42);
$plugin->exec();
}
?>
MfG
Niels
--=20
| http://www.kolleg.de =B7 Das Portal der Kollegs in Deutschland |
| http://www.bsds.de =B7 BSDS Braczek Software- und DatenSysteme |
| Webdesign =B7 Webhosting =B7 e-Commerce =B7 Joomla! Content Management =
|
------------------------------------------------------------ ------