2181 votes

Quand faut-il utiliser auto vs $this ?

En PHP 5, quelle est la différence entre l’utilisation de et ?

Où en est chaque approprié ?

1897voto

John Millikin Points 86775

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, utiliser pour les membres non statiques, utilisez pour les membres statiques.

762voto

nbeagle Points 4451

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.

484voto

Sqoo Points 2522

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

123voto

MrZebra Points 6508

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.com

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.

Powered by:

X