Page 1 sur 1

Pb d'accès à un attribut dans une classe extended

Posté : 15 avr. 2011, 11:08
par VaN
Bonjour,

j'ai une classe Object_Model, qui me permet de définir tout un tas de fonctions utiles dans toute mon application.

je fais hériter de cette classe toutes mes autres classes, pour qu'elles aient accès à ces fonctions.
class User extends Object_Model {

}
Dans Object_Model, j'ai également une méthode hydrate() qui me permet d'attribuer les valeurs à mes attributs :
class Object_Model {
	
	public function __construct() {
	
	}
	public function hydrate($array) {
		foreach($array as $key => $value) {
			$this->$key = $value;
		}
	}
	
Et lorsque j'initialise un nouveau User, j'apelle hydrate() :
class User extends Object_Model {
	
	
	private $user_id;
	private $user_datetime;
	private $user_prenom;
	private $user_nom;
	private $user_telephone;
	private $user_mail;
	
	public function __construct($object_or_array_or_id = '') {
		
		global $lang;

		if(is_object($object_or_array_or_id)) {
			$item = $object_or_array_or_id;
		}
		if(is_array($object_or_array_or_id)) {
			$item = $object_or_array_or_id;
		}
		elseif(is_numeric($object_or_array_or_id)) {
			$item = get_row_from_query(sprintf("SELECT USERS.*
			FROM " . TABLES__ADMIN_USERS . " USERS 
			WHERE user_id = '%d'", mysql_real_escape_string($object_or_array_or_id)));
		}
		
		if(!empty($item)) {
			$this->hydrate($item);
		}
		
	}
}
Sauf qu'actuellement, PHP me retourne une erreur de scope :
Fatal error: Cannot access private property User::$user_nom in Z:\Production\common\classes\class.object_model.php on line 38
Ce que je comprend tout à fait. $user_nom est private (ce qui est logique). Est-il possible d'utiliser cette fonction hydrate() dans les classes filles ? Si non, je dois forcément re-déclarer hydrate() dans toutes mes classes ? Une autre solution ?

Re: Pb d'accès à un attribut dans une classe extended

Posté : 15 avr. 2011, 23:04
par hypercys
salut,

tu peux passer tes proprietes en prtected , ca ne marcherait pas ???
++

Re: Pb d'accès à un attribut dans une classe extended

Posté : 16 avr. 2011, 01:49
par devlop78
Tu demandes à ta classe mère d'accéder à des données privées de la classe fille. Ca peut paraître déroutant puisque c'est toi qui développes, et que si tu hérites, alors tout devrait être accessible, mais cela fait bien parti du concept de l'encapsulation. Donc ne pas hésiter à utiliser private/protected selon contexte, final/abstract aussi pour empecher l'override ou le rendre obligatoire, etc.