Pour développer Berry, en réponse, que le réglage du niveau d'accès protégé permet d' __get et __set pour être utilisé avec déclarées explicitement les propriétés (lors de l'accès à l'extérieur de la classe, au moins) et la vitesse est beaucoup plus lente, je vais vous citer un commentaire à partir d'une autre question sur ce sujet et de faire un cas pour l'aide quand même:
*Je suis d'accord qu' __get est plus lente à une coutume fonction get (faire les mêmes choses), c'est 0.0124455 le temps de __get() et ce 0.0024445 est de coutume get() après 10000 boucles.* – Melsi Nov 23 '12 à 22:32 Meilleures pratiques: PHP les Méthodes Magiques __ensemble et __get
Selon Melsi tests, beaucoup plus lent est environ 5 fois plus lent. C'est certainement beaucoup plus lent, mais aussi de noter que les tests montrent que vous pouvez toujours accéder à la propriété avec cette méthode 10 000 fois, le décompte du temps de la boucle d'itération, dans environ 1/100 de seconde. Il est beaucoup plus lent en comparaison avec la réalité des méthodes get et set défini, et c'est un euphémisme, mais dans le grand schéma des choses, même 5 fois plus lent n'est jamais vraiment lent.
Le temps de calcul de l'opération est encore négligeable et pas la peine d'envisager, dans 99% des applications du monde réel. La seule fois où il devrait vraiment être évité, c'est quand vous êtes en fait accédant aux propriétés de plus de 10 000 fois en une seule demande. Des sites très fréquentés sont en train de faire quelque chose de vraiment mauvais si ils ne peuvent pas se permettre de jeter un peu plus de serveurs que pour maintenir leurs applications en cours d'exécution. Une seule ligne de texte d'annonce sur le pied de page d'un fort trafic de site où le taux d'accès devient une question pourrait probablement payer pour une ferme de 1 000 serveurs avec cette ligne de texte. L'utilisateur final ne va jamais à exploiter leurs doigts se demander quelle est la prise de la page si longtemps à charger en raison de votre application, l'accès à la propriété prend un millionième de seconde.
Je dis cela en tant que développeur de venir d'un milieu .NET, mais invisible méthodes get et set pour le consommateur ne l'est pas .NET de l'invention. Ils ne sont tout simplement pas les propriétés sans eux, et ces méthodes magiques sont de PHP, développeur de la grâce salvatrice de même pour l'appel de leur version de propriétés "propriétés". Aussi, l'extension de Visual Studio pour PHP prend en charge intellisense avec des biens protégés, avec ce truc dans l'esprit, je pense. Je pense qu'avec suffisamment de développeurs à l'aide de l'magiques __get et __set méthodes de cette manière, le PHP et les développeurs de régler le temps d'exécution pour répondre à la communauté des développeurs.
Edit: En théorie, les propriétés protégées semblait qu'il fallait dans la plupart des situations. Dans la pratique, il s'avère qu'il y a un grand nombre de fois, vous allez avoir à utiliser votre getters et setters lors de l'accès à des propriétés au sein de la définition de la classe et de l'étendue des classes. Une meilleure solution est une classe de base et de l'interface lors de l'extension d'autres classes, de sorte que vous pouvez simplement copier quelques lignes de code à partir de la classe de base dans la mise en œuvre de la classe. Je suis en train de faire un peu plus avec mon projet de classe de base, donc je n'ai pas une interface de fournir dès maintenant, mais ici, c'est la non testé dépouillé définition de la classe avec la magie de la propriété l'obtention et la configuration à l'aide de la réflexion afin de supprimer et de déplacer les propriétés protégé tableau:
/** Base class with magic property __get() and __set() support for defined properties. */
class Component {
/** Gets the properties of the class stored after removing the original
* definitions to trigger magic __get() and __set() methods when accessed. */
protected $properties = array();
/** Provides property get support. Add a case for the property name to
* expand (no break;) or replace (break;) the default get method. When
* overriding, call parent::__get($name) first and return if not null,
* then be sure to check that the property is in the overriding class
* before doing anything, and to implement the default get routine. */
public function __get($name) {
$caller = array_shift(debug_backtrace());
$max_access = ReflectionProperty::IS_PUBLIC;
if (is_subclass_of($caller['class'], get_class($this)))
$max_access = ReflectionProperty::IS_PROTECTED;
if ($caller['class'] == get_class($this))
$max_access = ReflectionProperty::IS_PRIVATE;
if (!empty($this->properties[$name])
&& $this->properties[$name]->class == get_class()
&& $this->properties[$name]->access <= $max_access)
switch ($name) {
default:
return $this->properties[$name]->value;
}
}
/** Provides property set support. Add a case for the property name to
* expand (no break;) or replace (break;) the default set method. When
* overriding, call parent::__set($name, $value) first, then be sure to
* check that the property is in the overriding class before doing anything,
* and to implement the default set routine. */
public function __set($name, $value) {
$caller = array_shift(debug_backtrace());
$max_access = ReflectionProperty::IS_PUBLIC;
if (is_subclass_of($caller['class'], get_class($this)))
$max_access = ReflectionProperty::IS_PROTECTED;
if ($caller['class'] == get_class($this))
$max_access = ReflectionProperty::IS_PRIVATE;
if (!empty($this->properties[$name])
&& $this->properties[$name]->class == get_class()
&& $this->properties[$name]->access <= $max_access)
switch ($name) {
default:
$this->properties[$name]->value = $value;
}
}
/** Constructor for the Component. Call first when overriding. */
function __construct() {
// Removing and moving properties to $properties property for magic
// __get() and __set() support.
$reflected_class = new ReflectionClass($this);
$properties = array();
foreach ($reflected_class->getProperties() as $property) {
if ($property->isStatic()) { continue; }
$properties[$property->name] = (object)array(
'name' => $property->name, 'value' => $property->value
, 'access' => $property->getModifier(), 'class' => get_class($this));
unset($this->{$property->name}); }
$this->properties = $properties;
}
}
Toutes mes excuses si il y a des bogues dans le code.