En PHP 5, quelle est la différence entre l’utilisation de et
?
Où en est chaque approprié ?
En PHP 5, quelle est la différence entre l’utilisation de et
?
Où en est chaque approprié ?
De http://www.phpbuilder.com/board/showthread.php?t=10354489:
Utilisation
pour faire référence à l’objet actuel. Utilisation
pour faire référence à la classe en cours. En d’autres termes, utiliserpour les membres non statiques, utilisez
pour les membres statiques.
Le mot-clé auto ne PAS se référer simplement à la 'classe', au moins pas d'une manière qui vous limite à des membres statiques. Dans le contexte d'un non-membre statique, auto fournit également un moyen de contourner la vtable de l'objet actuel. Tout comme vous pouvez utiliser parent::methodName()
appeler les parents de la version d'une fonction, de sorte que vous pouvez appeler self::methodName()
d'appeler le courant classes de la mise en œuvre d'une méthode.
class Person {
private $name;
public function __construct($name) {
$this->name = $name;
}
public function getName() {
return $this->name;
}
public function getTitle() {
return $this->getName()." the person";
}
public function sayHello() {
echo "Hello, I'm ".$this->getTitle()."<br/>";
}
public function sayGoodbye() {
echo "Goodbye from ".self::getTitle()."<br/>";
}
}
class Geek extends Person {
public function __construct($name) {
parent::__construct($name);
}
public function getTitle() {
return $this->getName()." the geek";
}
}
$geekObj = new Geek("Ludwig");
$geekObj->sayHello();
$geekObj->sayGoodbye();
Cela permettra de sortie:
Bonjour, je suis Ludwig le geek
Au revoir de Ludwig la personne
sayHello()
utilise l' $this
pointeur, donc la vtable est appelé pour appeler Geek::getTitle()
.
sayGoodbye()
utilise self::getTitle()
, de sorte que la vtable n'est pas utilisé, et Person::getTitle()
est appelé. Dans les deux cas, nous avons affaire avec la méthode d'un objet instancié, et d'avoir accès à l' $this
pointeur dans les fonctions appelées.
NE PAS UTILISER self::
, utilisez static::
Il y a un autre aspect de la self:: qui est digne de mention. Fâcheusement self::
se réfère à la portée au point de la définition, pas au point d'exécution. Considérer cette classe simple avec deux méthodes:
class Person
{
public static function status()
{
self::getStatus();
}
protected static function getStatus()
{
echo "Person is alive";
}
}
Si nous appelons Person::status()
nous allons voir "la Personne est en vie" . Maintenant, considérons ce qui se passe lorsque nous prenons une classe qui hérite de cette:
class Deceased extends Person
{
protected static function getStatus()
{
echo "Person is deceased";
}
}
Appelant Deceased::status()
nous nous attendons à voir la "Personne décédée" cependant, ce que nous voyons, c'est "la Personne est en vie", comme le champ contient l'original de la définition de la méthode lors de l'appel à l' self::getStatus()
a été défini.
PHP 5.3 a une solution. l' static::
opérateur de résolution de mise en œuvre des "late static binding", qui est une façon élégante de dire que sa liée à la portée de la classe appelée. Modifiez la ligne status()
de static::getStatus()
, et les résultats sont ce que vous attendez. Dans les anciennes versions de PHP, vous devez trouver une bidouille pour ce faire.
http://php.net/manual/en/language.oop5.late-static-bindings.php
Donc, pour répondre à la question, non pas comme demandé ...
$this->
fait référence à l'objet courant (une instance d'une classe), alors que l' static::
fait référence à une classe
self
(pas de $self) désigne le type de classe, où qu' $this
fait référence à l'actuelle instance de la classe. self
est pour l'utilisation dans les fonctions membres statiques pour vous permettre d'accéder membre statique des variables. $this
est non utilisés pour des fonctions membres statiques, et est une référence à l'instance de la classe sur lequel la fonction a été appelée.
Parce qu' this
est un objet, vous l'utilisez comme: $this->member
Parce qu' self
n'est pas un objet, c'est essentiellement un type qui se réfère automatiquement à la classe actuelle, vous l'utilisez comme: self::member
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.