ReflectionMethod will nicht invoken
Post removed (X-No-Archive: yes)
Re: ReflectionMethod will nicht invoken
Post removed (X-No-Archive: yes)
Re: ReflectionMethod will nicht invoken
Karl Steiner schrieb:
> Also so, dass der 1. Parameter als Referenz übergeben wird.
>
> Bei Objekten, wie es hier ja zwingend eines sein muss, ist diese
> Deklaration genau genommen unnötig, da Objekte sowieso immer als
> Referenz übergeben werden.
Falsch, er ist nicht unnötig, sondern eher falsch dann. Objekte werden
als Referenz übergeben, wenn den Adressoperator benutzt hast eine
Referenz auf eine Referenz, was weitere Auswirkungen nach sich zieht.
Also es macht sehr wohl einen Unterscheid.
> So funktionierte der Aufruf der Methode über invoke() eines
> ReflectionMethod-Objekts nicht.
>
> Entfernt man das '&', was genau genommen überhaupt keine Auswirkung auf
> die interne Abhandlung der Parameterübergabe hat, funktioniert mein
> Code-Beispiel.
>
> Normalerweise dürfte kein Unterschied bestehen (wie beim normalen Aufruf
> der Methode ohne Reflection-Zugriffe auch).
>
> Ich hätte nicht gedacht, dass PHP so ein Mist ist.
>
> Bugs, die die Performance schwerst beeinträchtigen hab ich ja schon
> erlebt, aber ein PHP-Bug, der mein Programm abstürzen lässt wie oben,
> das ist mir neu.
>
> Habt ihr solche PHP-Bugs auch schon mit erlebt?
Klar, jede Endlosrekursion lässt den Interpreter abstürzen zum Beispiel.
Man müsste hier jetzt natürlich wissen, warum es nicht geht und wie es
doch gehen könnte mit Adressoperator (habe Reflection noch nie benutzt).
Aber dass eine Software Bugs hat ist eine Tatsache, die jede Software
mit sich bringt. Warum sollte PHP hier eine Ausnahme sein.
--
Mit freundlichen Grüßen,
Christoph Herrmann
http://dragonprojects.de/
Re: ReflectionMethod will nicht invoken
Post removed (X-No-Archive: yes)
Re: ReflectionMethod will nicht invoken
Karl Steiner schrieb:
> In meiner Welt gibt es nicht "eher falsch". Entweder ist es falsch oder
> nicht. ;-)
Richtig: Wenn du dem Objekt innerhalb der Methode keinen neuen Wert zuweist.
Falsch: Wenn du das doch tust, weil dann ändert sich deine übergebene
Variable außen, falls es als Referenz übergibst, siehe unten
Daher gibt es ein eher falsch, je nachdem was du mit dem übergebenen
Objekt machst. Es ist ein falsch je nach Anwendungsfalls halt.
> Die Frage ist, was denn der Unterschied zwischen einer Referenz auf eine
> Referenz auf ein Objekt, und einer Referenz auf ein Objekt sein soll ...
>
> Du kannst dir diese Frage ja zu beantworten versuchen. Den PHP-internen
> Umgang damit sieht man auch ganz gut, wenn man die entsprechenden
> Objekte bzw. Referenzen mit var_dump ausgibt.
>
> Die Dinger sind nämlich völlig identisch und auch von ihrer
> Funktionalität dürfen sie sich nicht unterscheiden, da diese 2 Arten von
> Referenzen völlig gleichwertig sind.
Eine Referenz auf ein Objekt
$a = new Klasse('A');
Die Referenz wird kopiert in die Variable $a, beide Variablen besitzen
zwei unabhängige Referenz auf das selbe Objekt, hier kann man $b
unabhängig von $a einen neuen Wert zuweisen
$b = $a;
$b = new Klasse('B'):
Lassen wir den Parameter aus dem Konstruktor zurück geben, erhalten wir
hier mit Sicherheit 'A' zurück
print $a->get();
Wenn man $b aber zu einer Referenz auf $a macht, dann würde die neue
Zuweisung von $b in den Speicherbereich von $a schreiben und die
Ursprüngliche Variable damit ändern
$b = &$a;
$b = new Klasse('B');
Lassen wir den Parameter aus dem Konstruktor zurück geben, erhalten wir
hier mit Sicherheit 'B' zurück
print $a->get();
Irgendwo weiter oben in einem anderen Thread hab ich das auch mal
erklärt und da wurden auch offiziellen Quellen glaub ich genannt, wo das
Verhalten dokumentiert ist. Kenne aber weder den Thread noch die Quellen
dazu, aber vielleicht hat jemand andres nen besseres Gedächtnis.
> PHP fällt mir besonders auf, was Fehlfunktionen und scheinbar
> Unfertiges/nicht ausreichend Gestestetes betrifft.
Hatte diesbezüglich noch keinerlei Probleme, vielleicht nehme ich viel
zu wenig exotische Sachen... :)
> Ich setze es ja nur für ein kleines privates Projekt ein - für normale
> Aufgaben jenseits von Webseiten-Anzeige ist es scheinbar nicht wirklich
> zu gebrauchen.
Was für eine Aussage... Wetten mit deinem Hammer kannst du schlecht ein
9mm Loch in die Wand bohren? PHP ist nun mal keine Universalsprache wie
Java und will es auch nicht wirklich sein. PHP ist auf die Entwicklung
von Webseiten spezialisiert und dort liegen auch die Stärken von PHP.
Genau wie bei Perl die Stärken in der Textmanipulation, bei Java in der
plattformunabhängigen Anwendungsentwicklung und C++ in der systemnahen
Programmierung liegen. Jede Sprache hat ihre Stärken und ein guter
Entwickler nimmt für seine Problemstellung idealer Weise die Sprache die
dafür geeignet ist.
> Das fängt schon an mit der Unmöglichkeit, komplexere Anwendungen
> aufgrund des Sprachdesigns warten zu können ...
Die Grund, ob eine Software wartbar ist oder nicht sitzt vor dem
Rechner. Eine PHP Software kann fast ebenso gut Wartbar sein wie ein
Java Programm wenn es dementsprechend gutes API Design und Dokumentation
aufweist. Die Differenzen, die wirklich in der Sprache liegen (fehlende
Typensicherheit bei PHP zum Beispiel) kann man durch API Dokumentation
ergänzen, wenn auch nicht garantieren, aber dafür hat PHP andere Stärken
gegenüber Java. Aber unmöglich ist es deswegen auf jeden Fall nicht.
--
Mit freundlichen Grüßen,
Christoph Herrmann
http://dragonprojects.de/
Re: ReflectionMethod will nicht invoken
..oO(Karl Steiner)
>Christoph Herrmann schrieb:
>
>> Falsch, er ist nicht unnötig, sondern eher falsch dann. Objekte werden
>> als Referenz übergeben, wenn den Adressoperator benutzt hast eine
>> Referenz auf eine Referenz, was weitere Auswirkungen nach sich zieht.
>> Also es macht sehr wohl einen Unterscheid.
>
>In meiner Welt gibt es nicht "eher falsch". Entweder ist es falsch oder
>nicht. ;-)
>
>Die Frage ist, was denn der Unterschied zwischen einer Referenz auf eine
>Referenz auf ein Objekt, und einer Referenz auf ein Objekt sein soll ...
In PHP 5 _gibt_ es da einen Unterschied ...
>Du kannst dir diese Frage ja zu beantworten versuchen. Den PHP-internen
>Umgang damit sieht man auch ganz gut, wenn man die entsprechenden
>Objekte bzw. Referenzen mit var_dump ausgibt.
>
>Die Dinger sind nämlich völlig identisch und auch von ihrer
>Funktionalität dürfen sie sich nicht unterscheiden, da diese 2 Arten von
>Referenzen völlig gleichwertig sind.
Nö. Objekte in PHP 5 werden über eine interne ID (Handle) addressiert.
Das ist _keine_ Referenz im Sinne von PHP. Somit sind
$foo = new TFoo();
$bar = &new TFoo();
auch in PHP 5 zwei verschiedene Paar Schuhe, auch wenn man von diesem
Unterschied in der Regel nichts merkt. Erstere Anweisung weist $foo das
Handle für das zuvor erzeugte Objekt zu, die zweite Anweisung erzeugt
hingegen eine Referenz auf das Objekt-Handle. Es gibt Situationen, in
denen kann dieser Unterschied tatsächlich Auswirkungen haben (es gab
hier schon einige Threads zu diesem Thema).
>> Klar, jede Endlosrekursion lässt den Interpreter abstürzen zum Beispiel.
>> Man müsste hier jetzt natürlich wissen, warum es nicht geht und wie es
>> doch gehen könnte mit Adressoperator (habe Reflection noch nie benutzt).
>> Aber dass eine Software Bugs hat ist eine Tatsache, die jede Software
>> mit sich bringt. Warum sollte PHP hier eine Ausnahme sein.
>
>PHP fällt mir besonders auf, was Fehlfunktionen und scheinbar
>Unfertiges/nicht ausreichend Gestestetes betrifft.
Bugs kommen in den besten Familien vor. PHP ist hier selbstverfreilich
keine Ausnahme, dennoch sind die aktuellen Versionen überaus stabil und
echte Bugs eher die Ausnahme.
>Ich setze es ja nur für ein kleines privates Projekt ein - für normale
>Aufgaben jenseits von Webseiten-Anzeige ist es scheinbar nicht wirklich
>zu gebrauchen.
Willst Du trollen oder hast Du einfach nur keine Ahnung?
>Das fängt schon an mit der Unmöglichkeit, komplexere Anwendungen
>aufgrund des Sprachdesigns warten zu können ...
Das liegt nahezu immer am Programmierer bzw. an mangelndem Verständnis
des benutzten Werkzeugs, nur seltenst an der Sprache selbst. Wenn Dir
PHP nicht gefällt bzw. Du Probleme hast, damit vernünftige Applikationen
und Klassenstrukturen zu entwerfen, dann versuch Dich an was anderem
bzw. lies entsprechende Fachliteratur, denn Applikationsdesign ist mehr
oder weniger sprachunabhängig.
Auch PHP taugt sehr wohl für größere Projekte. Natürlich gibt es hier
und da Probleme aufgrund der Natur von PHP als gewachsener Sprache, aber
das ist alles mit wenig Aufwand lösbar. Wenn einem die Terminologie in
PHP partout nicht gefällt (z.B. fooBar() vs. foo_bar()), dann schreibt
man sich halt ein paar kleine Wrapper-Klassen und fertig. Solche Klassen
schreibt man einmal und damit hat sich's. Das ist in anderen Sprachen
genauso.
Micha