Path: csiph.com!news.swapon.de!fu-berlin.de!uni-berlin.de!individual.net!not-for-mail From: =?utf-8?Q?Karl_Pfl=C3=A4sterer?= Newsgroups: de.comp.lang.php Subject: Re: Existenz von Methoden pruefen (inkl. use) Date: Fri, 13 May 2022 09:04:38 +0200 Lines: 63 Message-ID: References: <1t627ce1bfi2d488n3e8%sfroehli@Froehlich.Priv.at> <3t627d5ab8i3ab98n3e8%sfroehli@Froehlich.Priv.at> Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Trace: individual.net wko7iuLy+VZ/5C7BCSLk4Aict6+BQ5bZzRw/zbezIoL6pR/bk= Cancel-Lock: sha1:2QCRo5Nz/kDlcw7D8WzmWkFv4/w= sha1:r6Q+usswLi7AiXyJhV0xFP1BNMw= User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/27.2 (darwin) Xref: csiph.com de.comp.lang.php:4832 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