Aller au contenu

surcharge de class


xorax

Sujets conseillés

bonjour,

j'ai un petit problème, j'utilise PHP 5.1.2 en local mais il y a PHP 5.0.4 sur mon serveur distant et apparement il n'a pas l'air de correctement prendre en compte la function __get dans une class...

<?php
class test {
private $x = 'abscisse';
private $y = 'ordonnee';

function __get($v){
return $this->$v;
}
}

$occ = new test();
echo $occ->x;
?>

ceci va me généré un erreur fatale de type "Cannot access private property" sur mon serveur distant alors que en local tout passe correctement.

j'ai éssayer de mettre la fonction en public ou private mais rien à faire.

je me demandais si c'est normal ou bien si j'ai oublié de faire quelque chose ??

Lien vers le commentaire
Partager sur d’autres sites

Pour les variables comme pour les fonctions, il est préférable d'éviter d'utiliser le underscore en premier caractère. En effet, ce caractère est utilisé dans le code du moteur php, et induit des erreurs/bugs.

De plus, "get" est plus ou moins un 'mot clé. A mon avis, tu aurais intéret à faire des essais avec un autre mot, 'foo' par exemple ;)

Pour ton script :

Il est possible que la variable que tu essaies d'atteindre ne soit pas accessible. Celle ci est déclarée en 'private', ce qui la rendrait a priori inaccessible (si php5 est bien 'objet'...)

Si ca marche en local et non sur le serveur, c'ets probablement parce que ton serveur local est plus permissif quant-aux erreurs ;)

Voilà, beaucoup d'incertitudes, mais l'erreur est probablement là :)

Lien vers le commentaire
Partager sur d’autres sites

Pour les variables comme pour les fonctions, il est préférable d'éviter d'utiliser le underscore en premier caractère. En effet, ce caractère est utilisé dans le code du moteur php, et induit des erreurs/bugs.

De plus, "get" est plus ou moins un 'mot clé. A mon avis, tu aurais intéret à faire des essais avec un autre mot, 'foo' par exemple

Sauf en php5 qui permet les surcharges :)

Les appels de méthodes et l'accès aux membres peuvent être surchargés via les méthodes __call(), __get() et __set(). Ces méthodes ne seront déclenchées que si votre objet, hérité ou non, ne contient pas le membre ou la méthode auquel vous tentez d'accéder. Toutes les méthodes surchargées doivent être définies en tant que public.

Depuis PHP 5.1.0, il est également possible de surcharger les fonctions isset() et unset() via, respectivement, les méthodes __isset et __unset.

Surcharge de membre

void __set ( string name, mixed value )

mixed __get ( string name )

bool __isset ( string name )

void __unset ( string name )

Les membres d'une classe peuvent être surchargés afin d'exécuter un code spécial contenu dans vos méthodes __set() et __get(). Le paramètre $name est le nom de la variable qui doit être définie ou recherchée. Le paramètre $valeur de la méthode __set() spécifie la nouvelle valeur à donner à la variable $name.

Voir la page: http://no2.php.net/manual/fr/language.oop5.overloading.php

Je retiens de la dernière citation qu'il y a eu des changements depuis la version 5.1.0 ... mais pas ceux que tu as remarqués. :(

Lien vers le commentaire
Partager sur d’autres sites

merci Dan...

donc problème sur 90plan OVH apparement...

d'ailleur je viens de relire la doc et ça me semble confus quand même :

... Toutes les méthodes surchargées doivent être définies en tant que public. ...

et dans l'exemple :

<?php
class Setter
{
public $n;
private $x = array("a" => 1, "b" => 2, "c" => 3);

private function __get($nm)
{
echo "Récupération de [$nm]\n";

if (isset($this->x[$nm])) {
$r = $this->x[$nm];
echo "Retour : $r\n";
return $r;
} else {
echo "Rien!\n";
}
}
...

:unsure:

Lien vers le commentaire
Partager sur d’autres sites

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...