levu: Reflection

Hallo,

wie kann ich in PHP mir alle Funktionen, die in einer bestimmten Datei deklariert sind, ausgeben lassen? Muss ich dafür _alle_ durchgehen, und jeweils gucken, in welcher Datei sie sind, oder geht das auch anders? Am Besten wäre es, wenn ich sogar noch angezeigt bekomme, wie viele Argumente die Funktion erwartet...

Danke!

mfg, Flo

--
sh:) fo:| ch:? rl:( br:^ n4:| ie:{ mo:| va:} de:> zu:} fl:{ ss:) ls:< js:|
  1. echo $begrüßung;

    wie kann ich in PHP mir alle Funktionen, die in einer bestimmten Datei deklariert sind, ausgeben lassen? Muss ich dafür _alle_ durchgehen, und jeweils gucken, in welcher Datei sie sind, oder geht das auch anders? Am Besten wäre es, wenn ich sogar noch angezeigt bekomme, wie viele Argumente die Funktion erwartet...

    Ich denke, Reflection ist das Mittel der Wahl. Eine Liste der Funktionen bekommt man ja noch mit get_defined_functions(), aber eine Zuordnung zu Dateien, in denen sie definiert sind, kennt nur der Reflektor. Das setzt natürlich voraus, dass die Datei inkludiert ist.

    Und dann gibt es noch den Tokenizer ...

    echo "$verabschiedung $name";

    1. Hallo,

      Das setzt natürlich voraus, dass die Datei inkludiert ist.

      hmm, das will ich nicht unbedingt...

      Und dann gibt es noch den Tokenizer ...

      Ich glaub, der wird mich weiterbringen :D
      Danke!

      mfg, Flo

      --
      sh:) fo:| ch:? rl:( br:^ n4:| ie:{ mo:| va:} de:> zu:} fl:{ ss:) ls:< js:|
      1. Hallo,

        Tokenizer ...
        Ich glaub, der wird mich weiterbringen :D

        Obwohl, wenn ich genau hingucke, doch nicht so doll, denn da müsste ich einfach zu viel programmieren, nur um dem Benutzer eine Liste von Funktionen anbieten zu können. Soll der sich die doch selber raussuchen (ich mach ne kleine online PHP-IDE)

        mfg, Flo

        --
        sh:) fo:| ch:? rl:( br:^ n4:| ie:{ mo:| va:} de:> zu:} fl:{ ss:) ls:< js:|
        1. Moin!

          Obwohl, wenn ich genau hingucke, doch nicht so doll, denn da müsste ich einfach zu viel programmieren, nur um dem Benutzer eine Liste von Funktionen anbieten zu können. Soll der sich die doch selber raussuchen (ich mach ne kleine online PHP-IDE)

          Dann kommst du um das Parsen der beteiligten PHP-Sourcedateien ja sowieso nicht drumrum, denn für eine IDE gehört es sich, Kommentare mit Annotations (phpDoc) auszuwerten - siehe z.B. http://www.phpdoc.org/.

          Andererseits: Hast du den Sicherheitsaspekt bedacht? Wer darf die IDE benutzen? Und wie führt sie Code aus? Es ist nahezu unmöglich, sich gegen bösartigen Code abzusichern, weil Negativlisten nur sehr schwer durchzusetzen sind (Code-Obfuscation), und Positivlisten den Sinn einer IDE ad absurdum führen.

          - Sven Rautenberg

          1. Hallo,

            Dann kommst du um das Parsen der beteiligten PHP-Sourcedateien ja sowieso nicht drumrum, denn für eine IDE gehört es sich, Kommentare mit Annotations (phpDoc) auszuwerten - siehe z.B. http://www.phpdoc.org/.

            ah, ok, das muss ich dann anscheinend noch mal in der Planung irgfenddwie berücksichtigen

            Andererseits: Hast du den Sicherheitsaspekt bedacht? Wer darf die IDE benutzen?

            jeder registrierte Benutzer -.-

            Und wie führt sie Code aus?

            hmm, wahrscheinlich entweder garnicht, dann geht eben debuggen nicht, dann ist es nur ein komfortabler Editor, oder man öffnet die PHP-Dateien per FTP und sie werden auf einem anderen Server ausgeführt, oder per Sandbox-Prinzip, obwohl das wahrscheinlich nicht möglich ist...

            Es ist nahezu unmöglich, sich gegen bösartigen Code abzusichern, weil Negativlisten nur sehr schwer durchzusetzen sind (Code-Obfuscation), und Positivlisten den Sinn einer IDE ad absurdum führen.

            hmm, ist mir auch klar, vielleicht wird die IDE dann auch so, dass sie sich jeder bei sich aufm Webspace installieren muss, mal gucken, hauptsächlich geht mir sowieso darum, Praxiserfahrung mir Ajax zu bekommen (RPC z.B.)

            mfg, Flo

            --
            sh:) fo:| ch:? rl:( br:^ n4:| ie:{ mo:| va:} de:> zu:} fl:{ ss:) ls:< js:|
            1. Moin!

              »» Andererseits: Hast du den Sicherheitsaspekt bedacht? Wer darf die IDE benutzen?
              jeder registrierte Benutzer -.-
              »» Und wie führt sie Code aus?
              hmm, wahrscheinlich entweder garnicht, dann geht eben debuggen nicht, dann ist es nur ein komfortabler Editor, oder man öffnet die PHP-Dateien per FTP und sie werden auf einem anderen Server ausgeführt, oder per Sandbox-Prinzip, obwohl das wahrscheinlich nicht möglich ist...

              Ok. Wenn du nur einen etwas netter ausgestatteten Texteditor schreibst, dann muss der natürlich keinerlei Code ausführen.

              Wenn er aber keinen Code ausführt, bist du mit Reflection vollkommen verkehrt, denn damit kriegst du die Infos nur, wenn der Code ausgeführt wurde - und das ist ein riesiges Problem, wenn der Inhaber des Webspaces der IDE und der Autor des im Editor befindlichen Codes nicht dieselben Interessen haben. Ideal ist, es wäre dieselbe Person, aber auch die üblichen Abhängigkeitsverhältnisse (macht im gleichen Team mit, Arbeitgeber/Arbeitnehmer etc.) lasse ich mal als noch beherrschbar durchgehen, weil in der Regel davon auszugehen ist, dass ein Vertrauensverhältnis besteht, und es für die Einschleusung von Schadcode nicht dieser IDE bedürfte, sondern auch andere Wege offen stünden.

              Der Tokenizer hingegen könnte durchaus dein Freund werden - zumindest sieht die Dokumentation sehr danach aus, dass sie dir einiges an Parserarbeit abnehmen könnte.

              - Sven Rautenberg

              1. Hallo,

                Der Tokenizer hingegen könnte durchaus dein Freund werden - zumindest sieht die Dokumentation sehr danach aus, dass sie dir einiges an Parserarbeit abnehmen könnte.

                ja schon, aber wie bekomme ich z.B. die Funtionssignatur raus? Da such ich mit nem RegExp wahrscheinlich schneller...

                mfg, Flo

                --
                sh:) fo:| ch:? rl:( br:^ n4:| ie:{ mo:| va:} de:> zu:} fl:{ ss:) ls:< js:|
                1. Moin!

                  »» Der Tokenizer hingegen könnte durchaus dein Freund werden - zumindest sieht die Dokumentation sehr danach aus, dass sie dir einiges an Parserarbeit abnehmen könnte.
                  ja schon, aber wie bekomme ich z.B. die Funtionssignatur raus? Da such ich mit nem RegExp wahrscheinlich schneller...

                  Sicher nicht. Dafür gibts doch die diversen Konstanten, die dir signalisieren, was da jetzt für ein Token ankommt. Die PHP.net-Doku hat ein Beispiel.

                  - Sven Rautenberg

                  1. Hallo,

                    Sicher nicht. Dafür gibts doch die diversen Konstanten, die dir signalisieren, was da jetzt für ein Token ankommt. Die PHP.net-Doku hat ein Beispiel.

                    Mal gucken... Bei Gelegenheit (wenn ich diesen Ansatz weiter verfolge) melde ich mich wieder :) Danke aber für die Hilfen auch im punkto Sicherheit einer IDE!!

                    mfg, Flo

                    --
                    sh:) fo:| ch:? rl:( br:^ n4:| ie:{ mo:| va:} de:> zu:} fl:{ ss:) ls:< js:|