Maison  >  Article  >  développement back-end  >  Existe-t-il un constructeur en php ?

Existe-t-il un constructeur en php ?

藏色散人
藏色散人original
2022-01-26 10:04:381774parcourir

Il existe un constructeur en php, et sa syntaxe est "__construct(mixed...$values ​​​​= ""): void". Une classe avec un constructeur appellera cette méthode en premier à chaque fois qu'un nouvel objet est créé, c'est donc très approprié. Faites un travail d'initialisation avant d'utiliser l'objet.

Existe-t-il un constructeur en php ?

L'environnement d'exploitation de cet article : système Windows 7, PHP version 7.1, ordinateur DELL G3

Y a-t-il un constructeur en php ?

constructeur php

__construct(mixed ...$values = ""): void

PHP permet aux développeurs de définir une méthode en tant que constructeur dans une classe. Les classes avec un constructeur appelleront cette méthode à chaque fois qu'un nouvel objet est créé, elle est donc très appropriée pour effectuer un travail d'initialisation avant d'utiliser l'objet.

Remarque : Si un constructeur est défini dans une sous-classe, le constructeur de sa classe parent ne sera pas appelé implicitement. Pour exécuter le constructeur de la classe parent, vous devez appeler parent::__construct() dans le constructeur de la classe enfant. Si la sous-classe ne définit pas de constructeur, celle-ci sera héritée de la classe parent comme une méthode de classe ordinaire (si elle n'est pas définie comme privée).

Exemple #1 Constructeur en héritage

<?php
class BaseClass {
    function __construct() {
        print "In BaseClass constructor\n";
    }
}
class SubClass extends BaseClass {
    function __construct() {
        parent::__construct();
        print "In SubClass constructor\n";
    }
}
class OtherSubClass extends BaseClass {
    // 继承 BaseClass 的构造函数
}
// In BaseClass constructor
$obj = new BaseClass();
// In BaseClass constructor
// In SubClass constructor
$obj = new SubClass();
// In BaseClass constructor
$obj = new OtherSubClass();
?>

Contrairement à d'autres méthodes, __construct() n'est pas soumis aux règles de compatibilité de signature lors de l'héritage.

Depuis PHP 5.3.3, dans l'espace de noms, les méthodes portant le même nom que le nom de la classe ne sont plus utilisées comme constructeurs. Les classes qui ne sont pas dans l'espace de noms ne sont pas affectées. Le constructeur est une méthode normale qui est automatiquement appelée lorsque l'objet correspondant est instancié. Par conséquent, n'importe quel nombre de paramètres peut être défini, qui peuvent être requis, avoir des types ou des valeurs par défaut. Les paramètres du constructeur sont placés entre parenthèses après le nom de la classe.

Exemple n°2 Utilisation des paramètres du constructeur

<?php
class Point {
    protected int $x;
    protected int $y;
    public function __construct(int $x, int $y = 0) {
        $this->x = $x;
        $this->y = $y;
    }
}
// 两个参数都传入
$p1 = new Point(4, 5);
// 仅传入必填的参数。 $y 会默认取值 0。
$p2 = new Point(4);
// 使用命名参数(PHP 8.0 起):
$p3 = new Point(y: 5, x: 4);
?>

Si une classe n'a pas de constructeur et que les paramètres du constructeur ne sont pas requis, les parenthèses peuvent être omises.

Constructeur à l'ancienne

Avant PHP 8.0.0, si une classe dans l'espace de noms global a une méthode du même nom, elle sera résolue en un constructeur à l'ancienne. Bien que les fonctions puissent être utilisées comme constructeurs, cette syntaxe est obsolète et entraîne une erreur E_DEPRECATED. Si __construct() et une méthode du même nom existent en même temps, __construct() sera appelée.

Les méthodes portant le même nom qu'une classe n'ont plus de signification particulière dans les deux cas suivants : les classes dans l'espace de noms, et n'importe quelle classe depuis PHP 8.0.0.

Utilisez __construct() dans le nouveau code.

Amélioration des attributs du constructeur

À partir de PHP 8.0.0, les paramètres du constructeur peuvent également être mis à niveau vers les attributs de classe en conséquence. Il est courant que les paramètres du constructeur soient attribués aux attributs de classe, sinon ils ne peuvent pas être utilisés. La fonction de promotion du constructeur est pratique pour ce scénario. Ainsi, l'exemple ci-dessus peut être réécrit de la manière suivante :

Exemple n°3 Utilisation de la promotion de la propriété du constructeur

<?php
class Point {
    public function __construct(protected int $x, protected int $y = 0) {
    }
}

Lorsque le paramètre du constructeur a un contrôle d'accès (modificateur de visibilité), PHP le traitera comme une propriété d'objet et un constructeur. en même temps et attribuez la valeur à l'attribut. Le constructeur peut être vide ou contenir d'autres instructions. Une fois la valeur du paramètre attribuée à l'attribut correspondant, des instructions de code supplémentaires dans le texte sont exécutées.

Tous les paramètres n’ont pas besoin d’être améliorés. Il est possible d’avoir un mélange de paramètres promus et non promus comme attributs, et il n’est pas nécessaire qu’ils soient en ordre. Les paramètres déclenchés n'affectent pas les appels de code dans le constructeur.

Remarque :

Le type de propriétés de l'objet ne peut pas être appelé pour éviter toute confusion dans le moteur. Par conséquent, le paramètre promu ne peut pas non plus être appelé. Toute autre déclaration de type est autorisée.

Remarque :

Les attributs placés dans les paramètres de boost du constructeur seront copiés en tant qu'attributs et paramètres en même temps.

Méthode de création statique

En PHP, chaque classe ne peut avoir qu'un seul constructeur. Cependant, il existe des situations dans lesquelles les objets doivent être construits de différentes manières avec différentes entrées. Dans ce cas, il est recommandé d’utiliser une construction d’encapsulation de méthode statique.

Exemple n°4 Utilisation de static pour créer une méthode

<?php
class Product {
    private ?int $id;
    private ?string $name;
    private function __construct(?int $id = null, ?string $name = null) {
        $this->id = $id;
        $this->name = $name;
    }
    public static function fromBasicData(int $id, string $name): static {
        $new = new static($id, $name);
        return $new;
    }
    public static function fromJson(string $json): static {
        $data = json_decode($json);
        return new static($data[&#39;id&#39;], $data[&#39;name&#39;]);
    }
    public static function fromXml(string $xml): static {
        // 自定义代码逻辑。
        $data = convert_xml_to_array($xml);
        $new = new static();
        $new->id = $data[&#39;id&#39;];
        $new->name = $data[&#39;name&#39;];
        return $new;
    }
}
$p1 = Product::fromBasicData(5, &#39;Widget&#39;);
$p2 = Product::fromJson($some_json_string);
$p3 = Product::fromXml($some_xml_string);

Vous pouvez définir le constructeur sur privé ou protégé pour empêcher vous-même des appels supplémentaires. Pour le moment, seules les méthodes statiques peuvent instancier une classe. Puisqu'ils appartiennent à la même classe définie, ils peuvent accéder aux méthodes privées et n'ont pas besoin d'être dans la même instance d'objet. Bien entendu, le constructeur n'a pas besoin d'être défini sur privé. Le fait que cela soit raisonnable dépend de la situation réelle.

Trois méthodes statiques montrent comment les objets peuvent être instanciés de différentes manières.

  • fromBasicData() transmet tous les paramètres requis au constructeur, crée l'objet et renvoie le résultat.

  • fromJson() accepte une chaîne JSON, la prétraite dans le format requis par le constructeur et renvoie un nouvel objet.

  • fromXml() accepte une chaîne XML, l'analyse et crée un objet simple. Puisque les paramètres sont facultatifs, le constructeur peut être appelé avec tous les paramètres ignorés. Attribuez ensuite des valeurs aux propriétés de l'objet et renvoyez le résultat.

Dans les trois exemples ci-dessus, le mot-clé static sera traduit en nom de classe de la classe où se trouve le code. Dans ce cas, c'est Produit.

Apprentissage recommandé : "Tutoriel vidéo PHP"

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn