Maison  >  Article  >  développement back-end  >  Explication détaillée de la façon dont PHP implémente l'instance de classe parent appelant le parent

Explication détaillée de la façon dont PHP implémente l'instance de classe parent appelant le parent

伊谢尔伦
伊谢尔伦original
2017-07-08 10:24:252096parcourir

L'exemple de cet article décrit comment PHP implémente parent pour appeler la méthode constructeur de la classe parent et la méthode remplacée. Partagez-le avec tout le monde pour votre référence. L'analyse spécifique est la suivante :

Écraser : repensé.

Lors de la définition d'un constructeur dans une sous-classe, vous devez transmettre des paramètres au constructeur de la classe parent, sinon nous risquons d'obtenir un objet incomplètement construit.

Pour appeler la méthode de la classe parent, vous devez d'abord trouver un moyen de référencer la classe elle-même : handle PHP fournit le mot-clé parent pour cela.

parent appelle le constructeur de la classe parent

Pour faire référence à une classe au lieu d'une méthode objet, vous pouvez utiliser :: (deux deux-points) au lieu de -> ;

Donc, parent::construct() signifie appeler la méthode construct() de la classe parent.

Modifiez le code de l'article précédent "Utiliser l'héritage de classe pour résoudre la duplication de code et d'autres problèmes" afin que chaque classe ne traite que ses propres données :

Le code est le suivant :

<?php
header(&#39;Content-type:text/html;charset=utf-8&#39;);
// 从这篇开始,类名首字母一律大写,规范写法
class ShopProduct{    // 声明类
public $title; // 声明
属性
public $producerMainName;
public $producerFirstName;
public $price;
function construct($title,$firstName,$mainName,$price){
$this -> title = $title;    // 给属性 title 赋传进来的值
$this -> producerFirstName= $firstName; 
$this -> producerMainName = $mainName; 
$this -> price= $price; 
}
function getProducer(){    // 声明方法
return "{$this -> producerFirstName }"."{$this -> producerMainName}";
}
function getSummaryLine(){
$base = "{$this->title}( {$this->producerMainName},";
$base .= "{$this->producerFirstName} )";
return $base;
}
}
class CdProduct extends ShopProduct {
public $playLenth;
function construct($title,$firstName,$mainName,$price,$playLenth){
parent::construct($title,$firstName,$mainName,$price);
$this -> playLenth= $playLenth;
}
function getPlayLength(){
return $this -> playLength;
}
function getSummaryLine(){
$base = "{$this->title}( {$this->producerMainName},";
$base .= "{$this->producerFirstName} )";
$base .= ":playing time - {$this->playLength} )";
return $base;
}
}
// 定义类
class BookProduct extends ShopProduct {
public $numPages;
function construct($title,$firstName,$mainName,$price,$numPages){
parent::construct($title,$firstName,$mainName,$price);
$this -> numPages= $numPages;
}
function getNumberOfPages(){
return $this -> numPages;
}
function getSummaryLine(){
$base = "{$this->title}( {$this->producerMainName},";
$base .= "{$this->producerFirstName} )";
$base .= ":page cont - {$this->numPages} )";
return $base;
}
}
 
?>


Chaque sous-classe appellera le constructeur de la classe parent avant de définir ses propres propriétés. La classe de base (classe parent) ne connaît désormais que ses propres données, et nous devrions essayer d'éviter de communiquer à la classe parent des informations sur la sous-classe. Il s'agit d'une règle empirique. Pensez-y si les informations d'une certaine sous-classe doivent être ". confidentiel" , par conséquent, la classe parent connaît ses informations et d'autres sous-classes peuvent en hériter, de sorte que les informations de la sous-classe ne restent pas confidentielles.

parent appelle la méthode remplacée de la classe parent

Le mot-clé parent peut être utilisé dans n'importe quelle méthode qui remplace la classe parent. Lors de la substitution d'une méthode d'une classe parent, nous ne voulons pas supprimer la fonction de la classe parent, mais l'étendre. Cela peut être réalisé en appelant la méthode de la classe parent dans l'objet actuel.
En regardant le code ci-dessus, vous pouvez constater qu'une grande partie du code est répétée dans la méthode getSummaryLine() dans les deux sous-classes. Nous devrions utiliser les fonctions existantes dans la classe ShopProduct au lieu d'un développement répété :

Le code est le suivant :

// 父类:ShopProduct
function getSummaryLine(){
$base = "{$this->title}( {$this->producerMainName},";
$base .= "{$this->producerFirstName} )";
return $base;
}
// 子类:CdProduct
function getSummaryLine(){
$base = parent::getSummaryLine();
$base .= ":playing time - {$this->playLength} )";
return $base;
}
// 子类:BookProduct
function getSummaryLine(){
$base = parent::getSummaryLine();
$base .= ":page cont - {$this->numPages} )";
return $base;
}

Nous avons complété la fonction "core" pour la méthode getSummaryLine() dans la classe parent ShopProduct, puis appelons simplement la méthode de la classe parent dans la sous-classe, puis ajoutez plus de données au résumé String, l'expansion de la méthode est réalisée.

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