avril
2008
J’ai cru trouver un bug dans PHP aujourd’hui :
<?php
class bar
{
private $a;
private $children = array();
public function __construct($infiniteDepth)
{
$this->a = 'foo';
if ($infiniteDepth) $this->children[] = new self(false);
}
public function privateAcces()
{
foreach ($this->children as $child) {
echo $child->a; // bug : acces autorisé
}
}
}
$t = new toto(true);
$t->privateAcces();
Il est possible d’accéder à une propriété privée depuis un objet, sans passer dans le contexte de $this. Ceci est en théorie impossible, mais l’exemple ci-dessus fonctionne..
Cependant il semblerait que pour le PHPGroup, ceci ne soit pas un bug, mais une feature
La réponse de Derick est par là.
Je ne suis pas d’accord avec cette réponse, et d’ailleurs Matthew Weier O’Phinney, un architecte avec qui je bosse sur le ZendFramework, approuve.
Les références des objets PHP sont donc basées sur les classes et non les objets, je suis d’accord que le cas est plutôt tordu, mais celui-ci provient d’un programme sur lequel je suis en train de bosser. Je trouve tout de même ce comportement dangereux, et illogique, mais bon, je fais pas la tête
3 Commentaires + Ajouter un commentaire
Commentaires récents
Archives
- novembre 2010
- août 2010
- juillet 2010
- juin 2010
- mai 2010
- avril 2010
- mars 2010
- février 2010
- janvier 2010
- décembre 2009
- novembre 2009
- octobre 2009
- septembre 2009
- août 2009
- juillet 2009
- juin 2009
- mai 2009
- avril 2009
- mars 2009
- février 2009
- janvier 2009
- décembre 2008
- novembre 2008
- octobre 2008
- septembre 2008
- août 2008
- juillet 2008
- juin 2008
- mai 2008
- avril 2008
- mars 2008
- février 2008
- janvier 2008
- décembre 2007
- novembre 2007
- octobre 2007
- septembre 2007
- août 2007
- juillet 2007
- juin 2007
- mai 2007
- avril 2007
- mars 2007
- février 2007
C’est vrai Il suffit de le savoir en fait ^^
C’est surtout, si je ne m’abuse, que c’est comme ça dans les autres langages objets (c++ et java pour ne citer qu’eux).
Et franchement, l’objectif de l’encapsulation étant de cantonner le code relatif à un attribut au sein de la classe, je ne vois pas en quoi ça pose problème. C’est même plutot logique…
Salut
Il me semble que cette discussion d’internals@ est liée à ta question :
[PHP-DEV] Inconsistencies when accessing protected members
http://marc.info/?l=php-internals&m=120221184420957&w=2
La réponse était similaire : it’s a feature