Ankündigung

Einklappen
Keine Ankündigung bisher.

in welchem Scope?

Einklappen

Neue Werbung 2019

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

  • in welchem Scope?

    Hallo,

    ich suche nach einer einfachen Lösung, festzustellen, ob der aktuelle code

    - im Global Scope
    - innerhalb einer Methode
    - innerhalb einer Funktion

    ausgeführt wird.

    die "exists" funktionen sind mir geläufig, aber ich habe keine Funktion wie etwa

    inclass() oder inmethod() oder infunction()

    gefunden. Wie also feststellen, wo der code gerade läuft?

    ... über debug_backtrace() wollte ich es nicht lösen ...

    Danke im Voraus!

  • #2
    Im Normalfall hat das die Funktion nicht zu interessieren, worin sie läuft. Wozu willst du das?

    Kommentar


    • #3
      Das mag ja sein ... mit Verlaub: Es interessiert mich trotzdem!

      Ich weiß, dass wir nun endlos diskutieren können, ob das Sinn macht oder nicht. Helft mir einfach, meinen Wissensdurst zu stillen, bitte.

      Und: Manchmal muss ein Anfänger auch selbst die Möglichkeit bekommen, Dummheiten zu ERLEBEN um dann seine Fehler zu BEGREIFEN. Wenn es denn einer ist.


      Ich möchte bestimmten Code an mehreren Stellen verwenden UND KEINE Funktion oder Methode dafür nutzen, sondern den code - auf den ersten Blick unverständlich, ich weiß - mittels copy & paste wiederverwenden.

      Also, danke für Eure Nachsicht ... und: gibt's ne (einfache) Lösung oder nur via dabug_backtrace() ?

      Kommentar


      • #4
        die "exists" funktionen sind mir geläufig, aber ich habe keine Funktion wie etwa

        inclass() oder inmethod() oder infunction()

        gefunden.
        Wieso auch in, Du willst die Klasse doch erfahren.
        http://php.net/manual/de/function.get-class.php
        wäre da was, oder gleich so:
        http://php.net/manual/de/book.reflection.php
        oder wieder ganz anders.

        Kommentar


        • #5
          Zitat von jwka61 Beitrag anzeigen
          Ich möchte bestimmten Code an mehreren Stellen verwenden UND KEINE Funktion oder Methode dafür nutzen, sondern den code - auf den ersten Blick unverständlich, ich weiß - mittels copy & paste wiederverwenden.
          1. das widerspricht jeglicher Coding Practise
          2. die einzige Stelle, wo man sowas machen kann, ist per include/require im globalen Scope – was dann deine Frage auch schon beantwortet
          3. in welchem Scope du gerade bist steht im Quellcode.

          Wenn du funktionalen Code (aus Funktionen/Methoden) wiederverwenden willst, mach ne sub-Funktion/Methode draus. sonst sh. 1.

          Kommentar


          • #6
            Warum denn nicht mit debug_backtrace?
            Wenn du mit der Option DEBUG_BACKTRACE_IGNORE_ARGS arbeitest und die Anzahl der zurückgegebenen Stack Frames auf 1 begrenzt, dürfte der Zeitbedarf sich in Grenzen halten.

            Kommentar


            • #7
              weil das nicht (zumindest nicht immer) mit wenigen Code-Zeilen geht. Man muss ja iterativ "zurückwandern", um z.B. die Klasse herauszufinden, in der der Code gerade abgearbeitet wird. Das kann ggf. Code aus einem Trait sein, der wiederum von einer Methode eines andere Trait gerufen wurde ... und so fort, bis man auf der Klasseneben landet. Bei einer Funktion ist's zugegeben einfach.

              Daher hoff(t)e ich auf eine eifnacge PHP Funktion, die dasselbe zurückgibt, wie __METHOD__, __FUNCTION__ oder get_called_class(), aber eben in einem "nicht-clas-scope" KEINE Warning wirft.

              ich hätte halt einfach gerne Code Zeilen wie:


              if ( <in_method> ) { .... }else{ ... }
              if ( <in_function> ) { .... }else{ ... }
              if ( <in_class> ) { .... }else{ ... }

              und an alkle, die den Zeck immer noch nicht erkennen: ruft doch mal einen ganz normalen PHP-file mit include ... innerhalb einer (abstrakten) Klasse auf. Dann werdet ihr feststellen, dass sämtliche andernorts gemachten Variablen im global scope nicht zur Verfügung stehen.

              Natürlich kann man in allen files immer statt "$<var>" schreiben "$GLOBALS[<var>]' aber ich glaube das macht niemand ...


              Kommentar


              • #8
                Wenn du mal erklären würdest warum / wofür du den Scope brauchst, könnte dir vielleicht geholfen werden. Ich kann z.B. den Nutzen nicht erkennen, da ich als Entwickler weiß, in welchem Scope ich mich befinde.

                Kommentar


                • #9
                  Zitat von jspit Beitrag anzeigen
                  Warum denn nicht mit debug_backtrace?
                  Wenn du mit der Option DEBUG_BACKTRACE_IGNORE_ARGS arbeitest und die Anzahl der zurückgegebenen Stack Frames auf 1 begrenzt, dürfte der Zeitbedarf sich in Grenzen halten.
                  Entweder so, oder dann eher nicht. Reflection ist etwas teures, das muss man sich bewusst sein.

                  Dein Vorhaben ist so nicht möglich - zum Glück, denn dafür wurden Programmiersprachen nicht entwickelt.

                  Kommentar


                  • #10
                    Zitat von SirSnyder Beitrag anzeigen
                    da ich als Entwickler weiß, in welchem Scope ich mich befinde.
                    Mit dieser Argumentation ... warum gibt's

                    __METHOD__,
                    __FUNCTION__
                    get_called_class()?

                    Jedenfalls die ersten beiden sollte der Entwickler doch auch wissen, oder nicht? Aber manchmal macht's einfach Sinn, selbst dieses Wissen "dynamisch" zu gestalten.

                    Also nochmals:
                    nehmen wir mal an, ich hätte Code, der mal in einem normalen, prozeduralen code und mal in einer Methode per "include" eingebunden wird. Dann kann es schon wichtig sein, zu wissen, wo der code gerade abläuft. Denn das kann der Entwickler eben gerade nicht wissen.

                    Irgendwiefrage ich mich, warum man auf eine ganz einfache (und vielleicht komische) Frage nicht auch auch eine ganz einfache Antwort wie "ja, gibts, heißt xyz" oder "nein, gibt's nicht" bekommen kann ... das ist alles, was ich wissen will: Macht es Sinn weiter zu suchen oder kann ich aufhören?

                    Laßt mich doch meine Fehler machen, Mensch! Keiner muss meinen Code benutzen ... außer mir selbst.



                    Kommentar


                    • #11
                      Zitat von jwka61 Beitrag anzeigen
                      Also nochmals:
                      nehmen wir mal an, ich hätte Code, der mal in einem normalen, prozeduralen code und mal in einer Methode per "include" eingebunden wird. Dann kann es schon wichtig sein, zu wissen, wo der code gerade abläuft. Denn das kann der Entwickler eben gerade nicht wissen.
                      Das braucht er auch nicht wissen. Code sollte für sich im eigenen Rahmen funktionieren. Die Verbindung nach "außen" geht über Interfaces. Betrachte eine Funktion als Blackbox. Du siehst außerhalb nicht, was in der Blackbox passiert und umgekehrt weiß die Blackbox drin nicht, was draußen passiert.

                      Zitat von jwka61 Beitrag anzeigen
                      Irgendwiefrage ich mich, warum man auf eine ganz einfache (und vielleicht komische) Frage nicht auch auch eine ganz einfache Antwort wie "ja, gibts, heißt xyz" oder "nein, gibt's nicht" bekommen kann ... das ist alles, was ich wissen will: Macht es Sinn weiter zu suchen oder kann ich aufhören?
                      Weil solche komische Fragen in 99,999% der Fälle darauf hindeuten, dass derjenige in eine Sackgasse läuft. Und bei sowas will man verständlicherweise nicht auch noch Unterstützung geben. Sei doch froh, dass dir die Leute wirklich helfen wollen und dich nicht ins offene Messer laufen lassen.

                      Zitat von jwka61 Beitrag anzeigen
                      Laßt mich doch meine Fehler machen, Mensch! Keiner muss meinen Code benutzen ... außer mir selbst.
                      Das ist vollkommen absurd. Wozu etwas bewusst falsch machen? Du darfst dich eben nicht darüber wundern, dass dir niemand behilflich sein will etwas falsch zu machen. Das ist einfach gegen die Natur. Menschen wollen anderen Menschen nichts schlechtes, außer sie hätten vielleicht selber einen Vorteil dadurch oder sie sind einfach krank.

                      Kommentar


                      • #12
                        Zitat von jwka61
                        ich hätte halt einfach gerne Code Zeilen wie:


                        if ( <in_method> ) { .... }else{ ... }
                        if ( <in_function> ) { .... }else{ ... }
                        if ( <in_class> ) { .... }else{ ... }
                        Warum auch immer Du das gerne haben möchtest. Mach es doch einfach:
                        PHP-Code:
                        class WhatScope_WhyEver {


                            private static 
                        $Scope;


                            public static function 
                        Analyze$scope ) {

                                if ( 
                        strpos($scope'::') ) {

                                    
                        self::$Scope 'class';

                                } else if( 
                        strlen($scope) == ) {

                                    
                        self::$Scope 'global';

                                } else {

                                    
                        self::$Scope 'function';

                                }

                                return 
                        self::$Scope;

                            }



                        Jetzt kannst Du an jeder beliebigen Stelle und Scope abfragen:
                        PHP-Code:
                        switch ( WhatScope_WhyEver::Analyze(__METHOD__) ) {

                            case 
                        'class':
                                
                        // was auch immer hier passieren soll
                                
                        break;

                            case 
                        'function':
                                
                        // was auch immer bei hier passieren soll
                                
                        break;

                            default:
                                
                        // was auch immer bei 'global' passieren soll
                                
                        break;


                        Du benötigst nur __METHOD__, denn im Falle eines ClassScopes wird ClassName::MethodName gesetzt und im Falle einer Funktion wirft __METHOD__ dasselbe, wie __FUNCTION__.
                        Dadurch musst Du nur noch prüfen, ob ein :: enthalten ist, was auf eine Klassen-Methode deutet. Ist dies nicht der Fall, ist es eine Funktion, abhängig von der Anzahl Zeichen. Denn bei leerem String handelt es sich um einen globalen Aufruf.

                        Natürlich kannst Du für den Switch auch IF-Konstrukte verwenden, das bleibt Dir überlassen.

                        Keine Ahnung, ob es das ist, was Du wolltest.
                        Wofür man sowas benötigt erschliesst sich mir allerdings auch noch nicht.

                        Kommentar


                        • #13
                          jwka61 Wenn ich mich richtig erinnere, wurdest du schon vor mehreren Jahren darauf hingewiesen, das diese "Architektur" mistig ist. Da jammerst du über Millisekunden und versuchts irgendwelche Optimierungen und baust solche Dinge.

                          http://www.php.de/forum/webentwicklu...33#post1259233

                          http://www.php.de/forum/webentwicklu...401#post979401

                          Falls es nicht um "das Thema" geht .. sorry.

                          Kommentar


                          • #14
                            [QUOTE=jwka61;n1462324
                            Daher hoff(t)e ich auf eine eifnacge PHP Funktion, die dasselbe zurückgibt, wie __METHOD__, __FUNCTION__ oder get_called_class(), aber eben in einem "nicht-clas-scope" KEINE Warning wirft.
                            [/QUOTE]

                            Konstanten werden zur Kompilierungszeit aufgelöst, das gibt Probleme wenn Konstanten sich in einem include-File befinden.
                            Für get_called_class() die Warnung abzufangen ist noch einfach:
                            PHP-Code:
                            $klassName = isset($this) ? get_called_class() : false
                            Hab auch mal in der Richtung gesucht, da ich Anfangs in meiner Debugklasse auch kein debug_backtrace() benutzen wollte.
                            Bin letztlich bei debug_backtrace() gelandet, weil ich nichts besseres/kürzeres/schnelleres gefunden habe.

                            Du hast auf meine Frage noch nicht geantwortet, warum du debug_backtrace() nicht nehmen möchtest.


                            Kommentar


                            • #15
                              Das ist vollkommen absurd. Wozu etwas bewusst falsch machen? Du darfst dich eben nicht darüber wundern, dass dir niemand behilflich sein will etwas falsch zu machen. Das ist einfach gegen die Natur. Menschen wollen anderen Menschen nichts schlechtes, außer sie hätten vielleicht selber einen Vorteil dadurch oder sie sind einfach krank.
                              ... oder sie meinen es einfach nur gut...

                              https://www.youtube.com/watch?v=T_BSgDVFIY8

                              VG
                              Jack

                              Kommentar

                              Lädt...
                              X