Groups | Search | Server Info | Keyboard shortcuts | Login | Register
Groups > de.comp.lang.php > #4832
| From | Karl Pflästerer <k@rl.pflaesterer.de> |
|---|---|
| Newsgroups | de.comp.lang.php |
| Subject | Re: Existenz von Methoden pruefen (inkl. use) |
| Date | 2022-05-13 09:04 +0200 |
| Message-ID | <m18rr5j4l5.fsf@mbp.pflaesterer.de> (permalink) |
| References | <1t627ce1bfi2d488n3e8%sfroehli@Froehlich.Priv.at> <m1fslej2ek.fsf@mbp.pflaesterer.de> <3t627d5ab8i3ab98n3e8%sfroehli@Froehlich.Priv.at> |
Stefan+Usenet@Froehlich.Priv.at (Stefan Froehlich) writes:
> On Thu, 12 May 2022 15:39:31 Karl Pflästerer wrote:
>> Stefan+Usenet@Froehlich.Priv.at (Stefan Froehlich) writes:
>>> Wie also tue ich so, als ob ich eine (statische) Methode aufrufe,
>>> ohne das dann tatsächlich zu tun? Bzw. lassen sich die
>>> use-Statements irgendwie doch beim Aufruf von method_exists()
>>> berücksichtigen (IMO nicht, weil die Aliases ja schon beim
>>> compilieren aufgelöst werden)?
>
>> Reflection https://www.php.net/manual/en/book.reflection.php ist keine
>> Option?
>
> Gute Frage, arg viel habe ich mit Reflection noch nicht gemacht.
>
> Soweit ich das sehe, gibt es damit das gleiche Problem, dass die
> use-Umgebung nicht berücksichtigt wird, d.h. ich komme nur so weit,
> wie ich ohnehin bereits bin.
>
> Ich jage z.B. die folgenden Zeilen durch den AST-Parser:
>
> #v+
> use PhpOffice\PhpSpreadsheet\Cell as Cell;
> $errorCodes = Cell\DataType::getErrorCodes();
> #v-
>
>
> bekomme dann u.a. ein Token \AST\AST_STATIC_CALL mit der Komponente
> children:
> ...
>
> Wenn class->flags \AST\AST_NAME ist (d.h. keine Variable für die
> Klasse verwendet wird), dann möchte ich herausfinden, ob:
>
> #v+
> $class=$node->children['class']->children['name'];
> $method=$node->children['method'];
> $eval=sprintf('use PhpOffice\PhpSpreadsheet\Cell as Cell; %s::%s();', $class, $method);
> eval($eval);
> #v-
>
> ...existiert, ohne dabei die Methode tatsächlich auszuführen
> (Prüfung der Argumente käme vielleicht irgendwann später), und zwar
> - erst das macht es für mich interessant - unter genau der aktuellen
> Laufzeitumgebung inklusive Autoloader, die von Installation zu
> Installation abweichen kann.
>
> Ok, ich könnte natürlich alle use-Statements iterativ durchgehen und
> schauen, ob ich wenigstens mit einem davon zu einer erfolgreichen
> Ausführung kommen. Hm, wenn's gar nicht anders geht, ist das
> vielleicht noch eine Option.
Du wirst bei einer dynamischen Sprache wie PHP, nur bis zu einem
gewissen Punkt kommen. Man kann zur Laufzeit extrem viel machen (dein
Autoloader mit dem eval() ist ein gutes Beispiel (haben wir
lustigerweise an einer Stelle vor Jahren auch so gemacht, um dynamisch
Default Klassen zu erzeugen)).
Ich denke, wenn man an so einen Punkt kommt, sollte man mal einen
Schritt zurücktreten und die eigene Architektur überdenken. Irgendwann
sind zu viele Erker und Wasserspeier am Haus; sieht zu Anfang sehr gut
aus, aber wenn du einmal putzen musst ...
KP
Back to de.comp.lang.php | Previous | Next — Previous in thread | Next in thread | Find similar
Existenz von Methoden pruefen (inkl. use) Stefan+Usenet@Froehlich.Priv.at (Stefan Froehlich) - 2022-05-12 10:53 +0000
Re: Existenz von Methoden pruefen (inkl. use) Karl Pflästerer <k@rl.pflaesterer.de> - 2022-05-12 15:39 +0200
Re: Existenz von Methoden pruefen (inkl. use) Stefan+Usenet@Froehlich.Priv.at (Stefan Froehlich) - 2022-05-12 19:26 +0000
Re: Existenz von Methoden pruefen (inkl. use) Karl Pflästerer <k@rl.pflaesterer.de> - 2022-05-13 09:04 +0200
Re: Existenz von Methoden pruefen (inkl. use) Stefan+Usenet@Froehlich.Priv.at (Stefan Froehlich) - 2022-05-13 07:11 +0000
csiph-web