56 votes

Le but de PHP constructeurs

Je suis en train de travailler avec des classes d'objet et de la structure de la classe, mais pas à un niveau complexe – il suffit de classes et de fonctions, puis, en un seul endroit, de l'instanciation.

Comme d' __construct et __destruct, merci de me le dire très simplement: quel est le but des constructeurs et destructeurs?

Je sais que le niveau de l'école explication théorique, mais je m'attends à quelque chose comme dans le monde réel, comme dans les situations qui nous devons les utiliser.

Fournir également un exemple, s'il vous plaît.

Ce qui concerne

52voto

Artefacto Points 50896

Un constructeur est une fonction qui est exécutée après que l'objet a été initialisé (son mémoire allouée, les propriétés de l'occurrence copié etc.). Son but est de mettre l'objet dans un état valide.

Souvent, un objet, d'être dans un état utilisable, nécessite des données. L'objectif du constructeur est de forcer ces données pour être donné à l'objet à l'instanciation de temps et d'interdire toutes les instances sans de telles données.

Envisager une simple classe qui encapsule une chaîne et a une méthode qui retourne la longueur de cette chaîne. Une implémentation possible serait:

class StringWrapper {
    private $str;

    public function setInnerString($str) {
        $this->str = (string) $str;
    }

    public function getLength() {
        if ($this->str === null)
            throw new RuntimeException("Invalid state.");
        return strlen($this->str);
    }
}

Pour être dans un état valide, cette fonction requiert setInnerString à être appelée avant d' getLength. En utilisant un constructeur, vous pouvez forcer toutes les instances pour être dans un bon état lors de l' getLength s'appelle:

class StringWrapper {
    private $str;

    public function __construct($str) {
        $this->str = (string) $str;
    }

    public function getLength() {
        return strlen($this->str);
    }
}

Vous pouvez aussi garder l' setInnerString pour permettre à la chaîne d'être modifié après l'instanciation.

Un destructeur est appelé lorsqu'un objet est sur le point d'être libéré de la mémoire. Généralement, il contient un code de nettoyage (par exemple, la fermeture de descripteurs de fichier de l'objet est la détention). Ils sont rares en PHP parce que PHP nettoie toutes les ressources détenues par le script lors de l'exécution du script se termine.

42voto

Christian Points 12142

Apprendre par l'exemple:

class Person {
  public $name;
  public $surname;
  public function __construct($name,$surname){
    $this->name=$name;
    $this->surname=$surname;
  }
}

Pourquoi est-ce utile? Parce que, au lieu de:

$person = new Person();
$person->name='Christian';
$person->surname='Sciberras';

vous pouvez utiliser:

$person = new Person('Christian','Sciberras');

Ce qui est moins de code et regarde de plus en plus propre!

Remarque: les réponses ci-dessous correctement l'état, les constructeurs/destructeurs sont utilisés pour une grande variété de choses, y compris: de/initialisation des variables (en particulier lorsque la valeur est variable), la mémoire de/l'allocation, les invariants (qui peut être dépassé) et plus propre code. Je tiens également à noter que les plus "propres " code" n'est pas seulement le "sucre" mais améliore la lisibilité, facilité de maintenance, etc.

8voto

Greg K Points 2566

Le constructeur est exécuté au moment de l'instanciation d'une instance de votre classe. Donc, si vous avez une classe Person:

class Person {

    public $name = 'Bob'; // this is initialization
    public $age;

    public function __construct($name = '') {
        if (!empty($name)) {
            $this->name = $name;
        }
    }

    public function introduce() {
        echo "I'm {$this->name} and I'm {$this->age} years old\n";
    }

    public function __destruct() {
        echo "Bye for now\n";
    }
}

Pour le démontrer:

$person = new Person;
$person->age = 20;
$person->introduce();

// I'm Bob and I'm 20 years old
// Bye for now

Nous pouvons remplacer la valeur par défaut définie avec initialisation par l'argument du constructeur:

$person = new Person('Fred');
$person->age = 20;
$person->introduce();

// if there are no other references to $person and 
// unset($person) is called, the script ends 
// or exit() is called __destruct() runs
unset($person);

// I'm Fred and I'm 20 years old
// Bye for now

J'espère que ça permet de démontrer où le constructeur et le destructeur sont appelés, quels sont-ils utiles pour?

  1. __construct() pouvez par défaut de certains membres de la classe de ressources ou de plusieurs structures de données complexes.
  2. __destruct() peut libérer des ressources telles que le fichier de base de données et les poignées.
  3. Le constructeur est souvent utilisé pour la composition de classe ou le constructeur de l'injection de dépendances nécessaires.

7voto

Gordon Points 156415

Le constructeur d'une classe définit ce qui se passe lorsque vous instanciez un objet de cette classe. Le destructeur d'une classe définit ce qui se passe quand vous détruisez l'instance de l'objet.

Voir le Manuel PHP sur les Constructeurs et Destructeurs:

PHP 5 permet aux développeurs de déclarer les méthodes constructeur pour les classes. Les Classes qui ont un constructeur appel de la méthode cette méthode sur chaque objet nouvellement créé, de sorte qu'il est adapté pour toute initialisation de l'objet peut avoir besoin avant de l'utiliser.

et

PHP 5 introduit un destructeur concept similaire à celle des autres langages orientés objet (C++. Le destructeur méthode sera appelée dès que toutes les références à un objet particulier sont supprimés ou lorsque l'objet est explicitement détruit ou dans n'importe quel ordre dans la séquence d'arrêt.

Dans la pratique, vous devez utiliser le Constructeur pour mettre l'objet dans un minimum d'état valide. Cela signifie que vous attribuez les arguments passés au constructeur pour les propriétés de l'objet. Si votre objet utilise une sorte de types de données qui ne peuvent être attribués directement à un titre de propriété, vous créez ici, par exemple

class Example
{
    private $database;
    private $storage;

    public function __construct($database)
    {
        $this->database = $database;
        $this->storage = new SplObjectStorage;
    }
}

Notez que pour garder vos objets testable, un constructeur ne doit pas faire de réel travail:

Travail dans le constructeur comme: création/initialisation des collaborateurs, la communication avec les autres services, et la logique pour mettre en place son propre état supprime les coutures nécessaires pour les tests, forçant les sous-classes/se moque d'hériter d'un comportement indésirable. Trop de travail dans le constructeur empêche l'instanciation ou de modifier des collaborateurs dans le test.

Dans ce qui précède Example, l' $database est un collaborateur. Il a un cycle de vie et le but de son propre et pourrait être une instance partagée. Vous le créez pas à l'intérieur du constructeur. D'autre part, l' SplObjectStorage est une partie intégrante de l' Example. Il a le même cycle de vie et n'est pas partagée avec d'autres objets. Ainsi, il est possible d' new dans le ctor.

De même, vous utilisez le destructeur de nettoyer après votre objet. Dans la plupart des cas, c'est inutile parce que c'est géré automatiquement par PHP. C'est pourquoi vous verrez beaucoup plus ctors que dtors dans la nature.

0voto

Jake Kalstad Points 1379

J'ai trouvé que c'était plus facile à comprendre quand j'ai pensé à l' new mot-clé avant que le constructeur: il dit simplement que ma variable d'un nouvel objet de son type de données serait donner à lui, sur la base duquel le constructeur que j'appelle et que je passe en elle, je peux définir l'état de l'objet à l'arrivée.

Sans le nouvel objet, nous serions vivant dans le pays d' null, et les plantages!

Le Destructeur est le plus évident, à partir de C++ point où, si vous n'avez pas un destructeur de la méthode d'effacer toute la mémoire pointé, il restera utilisé après le programme des sorties provoquant des fuites et le décalage sur les clients OS jusqu'au prochain redémarrage.

Je suis sûr qu'il ya plus de suffisamment de bonnes informations ici, mais sous un autre angle est toujours utile de ce que j'ai remarqué!

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