| PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Post your PHP questions here! |
 |

19-12-2011, 01:17
|
AmicaNoctis
 Moderatorin
|
|
Registriert seit: Jul 2009
Beiträge: 5.550
|
|
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 A { private $a = 12; private function getA () { return $this->a; } } class B { 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
__________________
Hast du die Grundlagen zur Fehlersuche gelesen? Hast du Code-Tags benutzt? 
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke! 
|

19-12-2011, 08:55
|
|
ezkimo
Registrierter Benutzer
|
|
Registriert seit: Apr 2005
Ort: Beckum / Westf.
Beiträge: 211
|
|
Moin Amica,
das war über einen anderen Weg auch schon vorher möglich. PHP ist böse!
PHP-Code:
class A { 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 />"; }
|

19-12-2011, 21:58
|
 |
fireweasel
Registrierter Benutzer
|
|
Registriert seit: Sep 2008
Ort: At home
Beiträge: 680
|
|
Zitat:
Zitat von ezkimo
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:
|
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.
__________________
PHP-Code:
class Brick implements Throwable {
// ...
}
|

19-12-2011, 22:02
|
AmicaNoctis
 Moderatorin
|
|
Registriert seit: Jul 2009
Beiträge: 5.550
|
|
Zitat:
Zitat von fireweasel
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!
__________________
Hast du die Grundlagen zur Fehlersuche gelesen? Hast du Code-Tags benutzt? 
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke! 
|

19-12-2011, 22:07
|
|
ezkimo
Registrierter Benutzer
|
|
Registriert seit: Apr 2005
Ort: Beckum / Westf.
Beiträge: 211
|
|
Ich wollt's gerade sagen. Es geht um das Ändern der Werte.
Ansonsten bleibt das Thema spannend.
|

20-12-2011, 00:38
|
 |
fireweasel
Registrierter Benutzer
|
|
Registriert seit: Sep 2008
Ort: At home
Beiträge: 680
|
|
Zitat:
Zitat von AmicaNoctis
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);
Zitat:
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 ...
__________________
PHP-Code:
class Brick implements Throwable {
// ...
}
|
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
|
| Themen-Optionen |
|
|
| Thema bewerten |
|
|
Forumregeln
|
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
|
PHP News
|