Ankündigung

Einklappen
Keine Ankündigung bisher.

eval() und magische Konstanten - delayed execution

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • eval() und magische Konstanten - delayed execution

    Ich suche nach einer Möglichkeit, innerhalb einers Code-Strings, der per eval() (viel später, zu 99,9% aller Aufrufe sogar gar nicht gar nicht und genau deshalb auch in einem CodeString) auf magische Konstanten wie

    __TRAIT__
    __CLASS__

    zuzugreifen, was aber nicht geht - __CLASS__ liefert z.B. blank, bei __FILE__ geht es gerade noch so, da wird dann "(nnn) : eval'd code" angehängt.

    Gibt's dafür eine Lösung?

    Es geht grundsätzlich darum, Informationen über Methoden, Traits, Klassen (Version, Datum, ob in Class oder Trait, Name von Klasse/Trait/Methode) etc. auslesen zu können.

    Dafür schwebt mir eine (globale) Methode vor, die diese Werte liefert.

    Bisher mache ich das so, dass in eiren init() Methode jeder Klasse und jedes Trait die Werte in ein (globales) array geschrieben werden. Das ist aber wie oben geschrieben unnötig und ich würde gerne die Execution-Zeit sparen und ebenfalls die parse Zeit, da die Library auf sehr schwachbrüstigen Geräten laufen wird ("embedded").
    Ich muss PHP im Kontext Home Automation nutzen (Vorgabe Hersteller und nicht zu ändern). Da kommt es leider ggf. auf ms an. Deshalb manche "seltsame" Frage.

  • #2
    Ich versuche erst garnicht zu verstehen was du da machen möchtest...
    __CLASS__ ist ja nur innerhalb einer Klasse definiert, außerhalb und auch innerhalb von eval wird "" geliefert.
    Womöglich bringt das folgende Snippet etwas Klarheit:
    PHP-Code:
    class foo{
        const 
    CLASS_NAME __CLASS__;

        public function 
    getClassConst(){
            return eval(
    'return __CLASS__;');
        }
     
        public function 
    getClassName(){
            return eval(
    'return self::CLASS_NAME;');
        }
    }

    $f = new foo;
    var_dump(
      
    __CLASS__,           //string(0) ""
      
    $f->getClassConst(), //string(0) ""
      
    foo::CLASS_NAME,     //string(3) "foo"
      
    $f->getClassName()   //string(3) "foo"
    ); 

    Kommentar


    • #3
      Reicht dir nicht ReflectionClass() für dein Anliegen?

      Kommentar


      • #4
        Ganz allgemein darf wohl eher noch ein Verweis darauf angebracht sein, dass eval() (oftmals) ein schlechtes Applikations-Design ist.
        [URL="https://github.com/chrisandchris"]GitHub.com - ChrisAndChris[/URL] - [URL="https://github.com/chrisandchris/symfony-rowmapper"]RowMapper und QueryBuilder für MySQL-Datenbanken[/URL]

        Kommentar


        • #5
          RefelctionClass gibt mir zwar die Infos über eine Klasse, aber ich möchte ja verschiedene Versionen von z.B. einer bestimmten Funktion tracen können, die eben aus unterschiedlichen Versionsabhängigen Traits kommt.

          Und gerade die Dateinamen und Traits gibt ReflectionClass m.W. nicht an.

          Dazu reicht dann Reflection nicht.

          @jspit:
          Das habe ich ja alles schon herausgefunden und deshalb diese Frage hier so gestellt. Ich werde wohl nicht umhin kommen, in der methode "_version()" doch mehr als nur eine Stringzuweisung machen zu müssen, also __FILE__ und __TRAIT__ (oder __CLASS__ bei einer Klassendefinition) per concettenation in den String einzubringen.

          Ich wollte eben gerne um Parse-Zeit von solchen Methoden rumkommen und bin davon ausgegangen, dass eine reine Zuweisung von Text zu einer Variablen (in dem Falle zu einem Klassen-Array) die kürzest denkbare Parse-Zeit in Anspruch nimmt, weil ja keinerlei besonderer Syntaxcheck nötig ist sondern der Parser schlicht bis zum Ende des Textes "vorscrollt".

          Zum Zeitpunkt des eval ist dann jede Menge Zeit vorhanden und da tun zusätzliche Abarbeitungs-Zeiten nicht mehr weh (weil das, wenn überhaupt, ganz am Ende von Prozeduren kommt). Und: ja, ich weiss, dass eval verpönt ist ... aber es dient hier einem "guten Zweck".
          Ich muss PHP im Kontext Home Automation nutzen (Vorgabe Hersteller und nicht zu ändern). Da kommt es leider ggf. auf ms an. Deshalb manche "seltsame" Frage.

          Kommentar


          • #6
            Zitat von jwka61 Beitrag anzeigen
            RefelctionClass gibt mir zwar die Infos über eine Klasse, aber ich möchte ja verschiedene Versionen von z.B. einer bestimmten Funktion tracen können, die eben aus unterschiedlichen Versionsabhängigen Traits kommt.

            Und gerade die Dateinamen und Traits gibt ReflectionClass m.W. nicht an.
            Ist das ein Fall für RTFM?

            http://docs.php.net/manual/en/reflec....gettraits.php
            http://docs.php.net/manual/en/reflec...etfilename.php

            Dazu reicht dann Reflection nicht.
            Ich vermute mal doch ...

            ... update ...

            ReflectionClass:: kennt auch eine Methode ::getParentClass()
            Wenn man die Wurst schräg anschneidet, hält sie länger, weil die Scheiben größer sind.

            Kommentar


            • #7
              naja ... RTFM:

              Note that getTraits will NOT return any traits inherited from a parent.
              Ich muss PHP im Kontext Home Automation nutzen (Vorgabe Hersteller und nicht zu ändern). Da kommt es leider ggf. auf ms an. Deshalb manche "seltsame" Frage.

              Kommentar


              • #8
                Ist ja auch ok, mit

                ReflectionClass::getParentClass

                in einer zb do/while schleife durchlaufen und dabei die Traits abfragen

                Kommentar


                • #9
                  Vielleicht übersehe ich da die Zusammehänge nicht oder stell mich blöd an ... deshalb nochmals etwas genauer mein Ziel:

                  Aufgabe heißt, in einer beliebigen Klasse herauszufinden, welche Version und welches Releas-Datum die Klasse und die benutzen Traits haben, und das nach Möglichkeit ohne parse-Aufwand zur Ladezeit.

                  Version und Datum werden entweder händisch oder per "make-Befehl" in einen Text im Code - einer Methode - geschrieben.

                  Im Erreiche ich das Ziel mit einem Array, welches die einzelnen Teile beinhaltet, das erfordert aber den Aufruf der Methode und vor allem wird "parse-Zeit" gebraucht.

                  Hätte ich einen geeigneten String, der zB. per EVAL ausgeführt werden kann, so entfiele dies.

                  Den Traitnamen und die Datei möchte ich nicht in den Text manuell eintragen, denn wenn im Laufe der Entwicklung z.B. der Traitname oder Dateiname geändert würde (oder der Code schlicht re-used), wird die Änderung nach den Regeln Murphy's in Code garantiert vergessen und damit eine falsche Info ausgegeben.
                  Ich muss PHP im Kontext Home Automation nutzen (Vorgabe Hersteller und nicht zu ändern). Da kommt es leider ggf. auf ms an. Deshalb manche "seltsame" Frage.

                  Kommentar


                  • #10
                    Der Hinweis auf ReflectionClass::getTraits kam ja schon.
                    Da Beispiele nicht so reichlich in der Doku sind, hier eines zum Problem (Vorlage Trait Beispiel Manual):
                    PHP-Code:
                    /**
                    * Trait SayWorld Version 1
                    */
                    trait SayWorld {
                        public function 
                    sayHello() { }
                    }
                    class 
                    MyHelloWorld {
                        use 
                    SayWorld;
                    }


                    $rClass = new ReflectionClass('MyHelloWorld');
                    $traits $rClass->getTraits();

                    $traitNamen array_keys($traits);

                    //1. trait
                    $rClassTrait1 = new ReflectionClass($traitNamen[0]);

                    //http://jspit.de/?page=debug
                    debug::write($rClassTrait1->getDocComment());
                    //string(35) ASCII    "/**\x0d\x0a* Trait SayWorld Version 1\x0d\x0a*/" 
                    Wichtig: Die Kommentare müssen unmiitelbar vor der Klasse/Methode/Trait stehen und mit /** beginnen.

                    LG jspit

                    Kommentar


                    • #11
                      ok. das ist prinzipiell ne gute idee, dann kann ich aber nicht mehr PHP_strip_whitespace beim "make" benutzen (mein "make" ersetzt code-Blöcke, fasst Dateien zusammen und komprimiert sie mit eben mit trim_whitespace, was auf kleinen Systemen einen merklichen Geschwindigkeitszuwachs bedeutet.

                      Aber die Idee ist prinzipiell gut, ich werde im "Make" nach diesen Remarks suchen und sie zuerst abarbeiten um sie in konkrete Text-Strings umzuwandeln. Dann habe ich genau, was ich brauche: Zur Laufzeit kompakten und schnellen Code, für die Programmer alle Infos und man kann sich sogar Platz lassen für die Informationen.

                      Weiterer Charme: Das kann ich sogar auf Methoden runterbrechen. Mal sehen.
                      Ich muss PHP im Kontext Home Automation nutzen (Vorgabe Hersteller und nicht zu ändern). Da kommt es leider ggf. auf ms an. Deshalb manche "seltsame" Frage.

                      Kommentar


                      • #12
                        Zugegeben: Das Reflection-Kapitel im PHP-Handbuch ist eines der eher schwach dokumentierten und auch die Benutzerkommentare sind nur spärlich vorhanden. Anscheinend benutzt das kaum einer ...

                        Zitat von jwka61 Beitrag anzeigen
                        ok. das ist prinzipiell ne gute idee, dann kann ich aber nicht mehr PHP_strip_whitespace beim "make" benutzen (mein "make" ersetzt code-Blöcke, fasst Dateien zusammen und komprimiert sie mit eben mit trim_whitespace, was auf kleinen Systemen einen merklichen Geschwindigkeitszuwachs bedeutet.
                        Komprimierst du den PHP-Quellcode?

                        Weiterer Charme: Das kann ich sogar auf Methoden runterbrechen. Mal sehen.
                        Ich glaube, das war der Sinn der hinter der Erfindung der Doc-Comments steckt: Dass man dort Informationen ablegt, die nicht im Quellcode stehen können.
                        Wenn man die Wurst schräg anschneidet, hält sie länger, weil die Scheiben größer sind.

                        Kommentar


                        • #13
                          ja, ich "komprimiere" die PHP files (es gubt natürlich eine unkomprimierte Version im DEV Verzeichnis)
                          Ich muss PHP im Kontext Home Automation nutzen (Vorgabe Hersteller und nicht zu ändern). Da kommt es leider ggf. auf ms an. Deshalb manche "seltsame" Frage.

                          Kommentar

                          Lädt...
                          X