Ankündigung

Einklappen
Keine Ankündigung bisher.

Variablenfunktionen in static Variablen

Einklappen

Neue Werbung 2019

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

  • Variablenfunktionen in static Variablen

    Hallo, test
    PHP-Code:
    ini_set('display_errors',1);
    echo 
    microtime(1),'<p>';

    class 
    {

        private static 
    $f NULL;

        public static function 
    __callStatic$name$args NULL ) {

            if( 
    count$args ) ) { self::$f = function( ) { echo '<h1>function is called!</h1>'; }; echo 'function is geted'; return; }

            echo 
    '<br>is_callable = ', ( int )is_callableself::$f );

            
    $a self::$f$a( );// functioniert
            
    call_user_funcself::$f );// functioniert
            
    self::$f( );// functioniert NICHT

        
    }


    Wieso functioniert dritte Variante nicht?
    Signaturrrrrrr

  • #2
    Weil $f eine Property ist und keine Methode?!
    Die wird ja erst durch __callStatic() zu einer Funktion definiert.
    Competence-Center -> Enjoy the Informatrix
    PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

    Kommentar


    • #3
      Als die private static Variable $f drin in der Function __callStatic( ) saß, functionierte alles ohne Problem...... Na ja, da drinn war sie eine echte Variable und keine Property..... Ok...

      Aber wieso functioniert alles im Object durch $this->. Da ist doch $f auch eine Property?
      PHP-Code:
      ini_set('display_errors',1);
      echo 
      microtime(1),'<p>';

      class 
      {

          private 
      $f NULL;

          public function 
      __call$name$args NULL ) {

              if( 
      count$args ) ) { $this->f['x'] = function( ) { echo '<h1>function is called!</h1>'; }; echo 'function is geted'; return; }

              echo 
      '<br>is_callable = ', ( int )is_callable$this->f['x'] );

              
      $a $this->f['x']; $a( );
              
      call_user_func$this->f['x'] );
              
      $this->f['x']( );

          }

      }

      $b=new B;
      $b->fun(1);
      $b->fun();

      echo 
      '<hr>';

      class 
      {

          private static 
      $f NULL;

          public function 
      __callStatic$name$args NULL ) {

              if( 
      count$args ) ) { self::$f['x'] = function( ) { echo '<h1>function is called!</h1>'; }; echo 'function is geted'; return; }

              echo 
      '<br>is_callable = ', ( int )is_callableself::$f['x'] );

              
      $a self::$f['x']; $a( );
              
      call_user_funcself::$f['x'] );
              
      self::$f['x']( );

          }

      }

      A::fun(1);
      A::fun();

      // 
      Signaturrrrrrr

      Kommentar


      • #4
        Gibt es dazu auch eine praktische Anwendung?
        wieso haste da HTML Code drin?
        Wieso instanzierst Du die Properties mit NULL, wo doch eh ein array draus wird?

        Fragen über Fragen eben.

        Kommentar


        • #5
          Ja, ich bastele einen Class, der aus minimale Anzahl von Methode besteht und nach bedarf, die nötige Functionen zu sich später anschliesst.
          HTML nur zumTest
          Instanziere mit NULL, weil gleich mit Function zu instanzieren geht nich, Parser läßt es nich zu
          Signaturrrrrrr

          Kommentar


          • #6
            Du wirst das alles schon wissen. Ich hab jedenfalls in der Docu kein Beispiel dieser Art gesehen

            http://php.net/manual/de/language.oop5.overloading.php

            Kommentar


            • #7
              Die dritte Variante in #1 funktioniert nicht, weil in self::$f() das $f() zuerst ausgewertet wird. Ich glaube, es gibt in PHP gegenwärtig keine Syntax, um daran was zu ändern. Ich weiß nicht, ob das irgendwo dokumentiert ist. In der Operator-Precedence-Tabelle taucht "::" nicht auf.

              - http://php.net/manual/en/language.op...precedence.php

              Auch Gebastel mit "{…}" ist bei statischen Aufrufen nicht möglich. Bei "->" lässt sich etwa etwas wie $foo->{$x()}(); schreiben. Ich kann nicht sagen, ob das eine Leerstelle in der Syntax ist oder ob es dafür (design)technische Gründe gibt.

              Kommentar


              • #8
                Zitat von mermshaus Beitrag anzeigen
                Die dritte Variante in #1 funktioniert nicht, weil in self::$f() das $f() zuerst ausgewertet wird.
                Ja, tatsächlich! Ich hab darüber nichts gesagt ( mein Fehler ) dass PHP zuerst ein Notice ausgibt "Undefined variable: f in ...\test.php" und dann folgt Fatal error "Function name must be a string in ....\test.php". Also, PHP betrachtet $f als Variable und nicht als Property.
                So habe ihm eine Variable gefüttert - drinn im __callStatic eine Variable mit gleichem Name eingefügt - und es ging hoch!
                Jetzt aber bleibt es mir nur noch von unendlichem Zicklus sich rauskriegen....

                Ne,... Geht nicht.... PHP nimmt die Value von innere $f als die Name für Ausruf eine Methode des A classes, als ob es wäre A::Value_von_Variable_f ( );


                Signaturrrrrrr

                Kommentar


                • #9
                  So habe ihm eine Variable gefüttert - drinn im __callStatic eine Variable mit gleichem Name eingefügt - und es ging hoch!
                  Jip. segfault

                  Ich sehe auch keine Möglichkeit, das auf die Weise hinzubiegen. Aber du hast im Zweifel ja zwei Varianten, die funktionieren.

                  Kommentar

                  Lädt...
                  X