PHP 5.4.0 RC3 für böse Menschen

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

  • PHP 5.4.0 RC3 für böse Menschen

    Hallo,

    ein bisschen frech ist das schon, dass man jetzt beliebig auf private Eigenschaften zugreifen kann. Andererseits ist es die konsequente Abbildung der Realität des Abbaus der Privatsphäre durch den Staat.

    PHP-Code:
    <?php
        
    class {
            private 
    $a 12;
            private function 
    getA () {
                return 
    $this->a;
            }
        }
        class 
    {
            private 
    $b 34;
            private function 
    getB () {
                return 
    $this->b;
            }
        }
        
    $a = new A();
        
    $b = new B();
        
    $c = function () {
            if (
    property_exists($this"a") && method_exists($this"getA")) {
                
    $this->a++;
                return 
    $this->getA();
            }
            if (
    property_exists($this"b") && method_exists($this"getB")) {
                
    $this->b++;
                return 
    $this->getB();
            }
        };
        
    $ca $c->bindTo($a$a);
        
    $cb $c->bindTo($b$b);

        echo 
    $ca(), "\n"// => 13
        
    echo $cb(), "\n"// => 35
    ?>
    Gruß,

    Amica
    [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
    Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
    Super, danke!
    [/COLOR]

  • #2
    Moin Amica,

    das war über einen anderen Weg auch schon vorher möglich. PHP ist böse!
    PHP-Code:
    class {
        
        private 
    $bla 'blubb';
        
        private 
    $fu 'bar';
    }

    $class = new A();
    $reflector = new ReflectionClass('A');

    foreach (
    $reflector->getProperties() as $prop) {
        if (
    $prop->isPrivate()) {
            
    $prop->setAccessible(true);
        }
        
    $oldValue $prop->getValue($class);
        echo 
    $prop->getName() . " => " $oldValue "<br />";
        
        
    $prop->setValue($class$oldValue ' boese!');
        
    $newValue $prop->getValue($class);
        echo 
    $prop->getName() . " => " $newValue "<br />";

    MM Newmedia | MeinBlog

    Kommentar


    • #3
      Zitat von ezkimo Beitrag anzeigen
      Moin Amica,

      das war über einen anderen Weg auch schon vorher möglich. PHP ist böse!
      [php]class A {

      private $bla = 'blubb';

      private $fu = 'bar';
      }

      $class = new A();
      $reflector = new ReflectionClass('A');
      // ...
      Ach herrjeh, das ging lange bevor man "Reflection" für PHP erfunden hatte. Und es müsste auch in 5.4 noch funktionieren:

      PHP-Code:
      class privatsphaere {
          private 
      $priv 'fred';
          protected 
      $prot 'barney';
          public 
      $publ '...';
      }

      $obj = new privatsphaere();
      $show_me_all = (array) $obj;
      var_dump($show_me_all); 
      Nebenbei lernt man da noch, wie der "Schutz" intern realisiert wird. *grusel*
      Umgekehrt geht das übrigens auch: Wer schon immer mal ein StdClass-Objekt mit geschützten Properties bauen wollte, castet das Array einfach zurück.

      Zitat von AmicaNoctis;
      Hallo,

      ein bisschen frech ist das schon, dass man jetzt beliebig auf private Eigenschaften zugreifen kann. Andererseits ist es die konsequente Abbildung der Realität des Abbaus der Privatsphäre durch den Staat.
      Ist das nicht eher die konsequente Abbildung der Funktionalität von Closures? Wenn PHP schon so ein Feature hat, dann finde ich nett, dass es (zur Abwechslung) auch einmal so funktioniert wie in anderen Sprachen.

      So richtig scheint man der Sache aber noch nicht zu trauen: Den zugehörige Eintrag im Handbuch musste ich mir ergoogeln. Die Site-interne Handbuch-Suche brachte kein Ergebnis und die Migration-Guide-Seite ist auch noch leer.
      Klingon function calls do not have “parameters”‒they have “arguments”‒and they always win them!

      Kommentar


      • #4
        Zitat von fireweasel Beitrag anzeigen
        Ach herrjeh, das ging lange bevor man "Reflection" für PHP erfunden hatte.
        Klar konnte man Dumps und serialisierte Strings schon immer lesen, aber man konnte den Wert nicht ändern!
        [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
        Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
        Super, danke!
        [/COLOR]

        Kommentar


        • #5
          Ich wollt's gerade sagen. Es geht um das Ändern der Werte.
          Ansonsten bleibt das Thema spannend.
          MM Newmedia | MeinBlog

          Kommentar


          • #6
            Zitat von AmicaNoctis Beitrag anzeigen
            Klar konnte man Dumps und serialisierte Strings schon immer lesen, aber man konnte den Wert nicht ändern!
            Oh, entschuldige, das '++' hatte ich übersehen. Macht es einen großen Unterschied, ob man nur eine geschützte Eigenschaft ändern kann, oder gleich das ganze Objekt umbaut?

            PHP-Code:
            $obj = new privatsphaere();
            $ser preg_replace('/fred/''dref'$ser);
            $obj unserialize($ser); 
            Ich wollt's gerade sagen. Es geht um das Ändern der Werte.
            ...
            Ich bin mir nicht sicher, ob das so gewollt war. Es wird eine Kopie des ursprünglichen Closure-Objects erzeugt, dessen Geltungsbereich auf das angegebene Objekt (oder die Klasse) erweitert ist. Dass man dadurch Zugriff auf die entsprechenden Variablen bekommt, ist klar. Aber warum sollte man das über eine Kopieraktion machen wollen? Dabei bleibt die Original-Closure als "Abfall" übrig. Außerdem muss für jedes Objekt, an das man eine Closure-Kopie später binden will, eine separate Verzweigung mit entsprechenden Abfragen vorgesehen werden. Ich fände es sinnvoller, wenn man beim Erzeugen des Closure-Objekts den Geltungsbereich auf ein angegebenes Objekt (oder eine Klasse) ausdehnen könnte ...
            Klingon function calls do not have “parameters”‒they have “arguments”‒and they always win them!

            Kommentar

            Lädt...
            X