l'accès privé de la variable de la fonction membre en PHP
J'ai dérivé d'une classe de Exception
, essentiellement comme suit:
class MyException extends Exception {
private $_type;
public function type() {
return $this->_type; //line 74
}
public function __toString() {
include "sometemplate.php";
return "";
}
}
Ensuite, j'ai tiré de MyException
comme suit:
class SpecialException extends MyException {
private $_type = "superspecial";
}
Si je throw new SpecialException("bla")
à partir d'une fonction, l'attraper, et aller echo $e
, puis le __toString
fonction doit charger un modèle, d'affichage, et ensuite, de ne pas renvoyer en fait rien à l'écho.
C'est ce qui est en gros dans le fichier de modèle
<div class="<?php echo $this->type(); ?>class">
<p> <?php echo $this->message; ?> </p>
</div>
dans mon esprit, cela devrait fonctionner. Cependant, j'obtiens l'erreur suivante lorsqu'une exception est levée et j'essaie de l'afficher:
Erreur fatale: Impossible d'accéder à la propriété privée SpecialException::$_type dans C:\path\to\exceptions.php sur la ligne 74
Quelqu'un peut-il expliquer pourquoi suis-je enfreindre les règles ici? Suis-je en train de faire quelque chose de terriblement d'esprit avec ce code? Est-il beaucoup plus idiomatiques façon de gérer cette situation? Le point de la $_type
variable (comme montré) que je veux un autre div class être utilisées, selon le type de l'exception interceptée.
Le retour à vide de l' __toString (), une Exception est encore plus douteux.
OriginalL'auteur Carson Myers | 2009-11-19
Vous devez vous connecter pour publier un commentaire.
Nom de la variable protégé:
Note: En PHP
protected
signifie que vos parents peuvent y accéder, trop.bon, je l'ai fait-mais maintenant je ne peux pas utiliser
$this->message
-- pas d'erreur, il affiche juste rien... pourquoi?tant pis, j'ai été la mise
$message
dans le constructeur parent au lieu de$this->message
. Aussi, j'ai réalisé que je fournis pas de détails de mise en œuvre de la façon dont j'ai été la mise le message de la première place. Mon mauvaisOriginalL'auteur dfilkovi
juste un exemple sur la façon d'accéder à la propriété privée
Comment puis-je faire "autre chose" que vous avez ici pour le setter?
OriginalL'auteur Fivell
Voir ma réponse ici:
https://stackoverflow.com/a/40441769/1889685
De PHP 5.4, vous pouvez utiliser le prédéfinies
Closure
classe de lier une méthode/propriété d'une classe à un delta fonctions qui a accès aux membres privés.La Fermeture de classe
Par exemple, nous avons une classe avec une variable privée et nous voulons y accéder en dehors de la classe:
PHP 5.4+
De PHP 7, vous pouvez utiliser la nouvelle
Closure::call
méthode, de lier n'importe quelle méthode/propriété d'un obect à une fonction de rappel, même pour les membres privés:PHP 7+
OriginalL'auteur Christos Lytras
Vous devez configurer l'accès protégé. Privé signifie qu'il ne peut être accessible depuis l'intérieur de sa propre classe et ne peut pas être héritée. Protégé permet de inhherited mais il ne peut toujours pas être accessibles directement depuis l'extérieur de la classe.
OriginalL'auteur RMcLeod
Si vous cochez la visibilité documentation, enterré dans un commentaire est:
Vous devriez faire
protected
de faire ce que vous essayez de faire.D'ailleurs, il semble que vous êtes juste en paramètre le nom de la classe - que vous pouvez simplement utiliser
get_class()
:OriginalL'auteur Greg
Vous convient en effet de changer le accessmodifier à
protected
lorsque vous'e builing l'héritage de classes.Un point supplémentaire, cependant, n'utilisez pas
return "";
mais il suffit d'utiliserreturn;
__toString()
renvoie une chaîneAh, je suis désolé! J'ai regardé au-dessus de votre __toString fonction.. juste vu que vous étiez de retour "rien". Vous avez tout à fait raison!
Il est très très très moche de laisser __toString() renvoie une chaîne vide. Vraiment, je vois pas de cas d'utilisation pour ce genre de chose. Mais vous avez raison, __toString() doit retourner une chaîne de caractères.
OriginalL'auteur Ben