2017-09-13 3 views
0

Je ne comprends pas ce qu'est __construct(). Je ne vois pas les différences entre ces deux exemples:Différence entre deux classes __construct()

1)

class Person { 

public function __construct($person) { 
    echo $person; 
} 

$person = new Person('Name'); 

2)

class Person { 
    public function name($name) { 
     echo $name; 
    } 
} 

$person = new Person(); 
$person->name('Name'); 
+3

Manuel: [constructeurs et destructeurs] (http://php.net/manual/fr/language.oop5.decon.php) –

+1

constructeur définit simplement le premier comportement requis lors de la création de l'objet – Kazz

+0

Vous ne pouvez pas voir la différence ?! L'un transmet l'argument au moment de la construction, l'autre à une autre méthode d'instance plus tard. Assez nette différence IMO. Vous pourriez vouloir clarifier pourquoi vous pensez que ce n'est pas différent. – deceze

Répondre

2

Vos deux exemples peuvent en effet sembler équivalents, mais à partir d'une seule perspective (la vôtre, maintenant).


class Person { // First case : using the constructor 

    public function __construct($person) { 
     echo $person; 
    } 
} 

// ---------------------------------------------------------------- 
$person = new Person('Name'); 

Dans cet exemple, vous faites très clairement que chaque objet de la classe Person (ou un de ses sous-classes) doit donner un nom dès sa création. Il n'y aura jamais de Person sans nom, à n'importe quel moment. C'est une contrainte de conception que vous choisissez de vous imposer (si vous avez l'intention de créer des objets de classe Person) ou d'autres, dans le cas où vous partagez votre code d'une manière ou d'une autre. Si l'on tente de violer cette contrainte, PHP va se bloquer avec un message d'erreur/d'avertissement explicite. (Demo: https://3v4l.org/hCXZ8)


class Person { // Second case : no constructor (equivalent to an empty constructor) 

    public function name($name) { 
     echo $name; 
    } 
} 

// ---------------------------------------------------------------- 
$person = new Person(); 
$person->name('Name'); 

Ceci est une bête différente: vous pouvez créer un objet de classe Person, et vous pouvez afficher un nom. Vous pouvez également créer un Person et ne jamais afficher un nom du tout. Vous ne savez peut-être même pas que vous le pouvez, en fait, si vous ne regardez pas le code de classe pour une raison quelconque (il est courant de donner à chaque classe un fichier distinct).


Dans les deux exemples que j'ai dessiné une ligne de commentaire entre la déclaration de classe et de l'utilisation, parce que ce sont deux points de vue différents (pensent qu'ils peuvent même être deux personnes différentes qui ne peuvent pas communiquer entre eux). En tant qu'auteur de classe, vous traduisez précisément vos contraintes dans le code le plus explicite que vous puissiez produire. En tant qu'utilisateur de la classe, vous ne voulez pas perdre de temps à comprendre les subtilités de la classe que vous utilisez: vous souhaitez créer des objets avec une complexité minimale, tirer parti de la fonctionnalité avec un minimum de surcharge et d'apprentissage. et les affaires.

4

utilisées dans cet exemple, le second est très bien.

Et si name était un champ de la classe mais au lieu d'une simple méthode qui fait écho? Quelle serait sa valeur avant de l'avoir explicitement définie?

Pour vous assurer que les champs sont initialisés et que la configuration est effectuée avant qu'un objet puisse être utilisé, utilisez le constructeur. Si vous n'avez pas besoin d'initialisation, vous n'avez pas nécessairement besoin d'écrire un constructeur explicite.

+0

Ok..Je comprends maintenant ... je pense ....mais je si vous voulez écrire un petit exemple pour mieux le comprendre. Merci beaucoup! –

+0

@ ΜάνοςΑρβανίτης Je n'ai pas écrit de PHP depuis un moment, donc j'espérais éviter d'écrire du code. Je ne voudrais pas que des erreurs introduisent une confusion supplémentaire dans la situation. Combien avez-vous étudié l'utilisation et la création d'objets? Si vous venez de commencer, le but du constructeur n'est peut-être pas évident. Dès que vous commencez à écrire des objets plus compliqués, cela devrait devenir plus clair. Le problème avec l'exemple que vous avez posté est qu'il n'y a aucun intérêt à utiliser une classe en premier lieu. La méthode pourrait aussi bien être une simple fonction. – Carcigenicate

+0

Il est inutile d'essayer de tirer des conclusions sur le fonctionnement des classes à partir du code qui abuse des classes en premier lieu. – Carcigenicate