Maison > Article > développement back-end > (Avancé) Apprendre les trois fonctionnalités majeures du PHP orienté objet (encapsulation, héritage, polymorphisme)
Ce qui suit est le texte de l'article :
1. Encapsulation
L'encapsulation consiste à encapsuler les données extraites et les opérations sur les données ensemble. . Protégées en interne, seules les opérations (méthodes) autorisées dans d'autres parties du programme peuvent opérer sur les données.
php fournit trois modificateurs de contrôle d'accès
public signifie global, accessible à l'intérieur de cette classe, en dehors de la classe, et
protected signifie protégé, seule cette classe ou sous-classe peut. access
private signifie privé et n'est accessible que dans cette classe
Les trois modificateurs ci-dessus peuvent modifier à la fois les méthodes et les attributs (variables). S'il n'y a pas de méthode, le modificateur d'accès est par défaut public, et les propriétés des membres doivent spécifier des modificateurs d'accès. En PHP4, il existe également cette façon d'écrire var $name, ce qui signifie des attributs publics. Cette façon d'écrire n'est pas recommandée.
Exemple :
<?php class Person{ public $name; protected $age; private $salary; function __construct($name,$age,$salary){ $this->name=$name; $this->age=$age; $this->salary=$salary; } public function showinfo(){ //这表示三个修饰符都可以在本类内部使用 echo $this->name."||".$this->age."||".$this->salary; } } $p1=new Person('张三',20,3000); //这里属于类外部,那么如果用下面的方法访问age和salary都会报错 // echo $p1->age; echo$p1->salary; ?><.>
public function setxxxx($val){ $this->xxxx=$val; } public function getxxxx(){ return $this->xxxx; }L'ensemble et l'arrivée ici sont uniquement destinés à faciliter l'identification, pas nécessaires Pour exemple :
public function getsalary(){ return $this->salary; //扩展:这里可以调用一些方法,如判断用户名等,正确才给访问 }En externe, vous pouvez utiliser echo $p1->getsalary(); Si vous souhaitez accéder à protected et private, vous pouvez également utiliser la méthode suivante, mais ce n'est pas recommandé, tant que vous le comprenez __set() et __get() __set() attribue des valeurs aux attributs protégés ou privés __set( $name,$val); __get() obtient la valeur protégée ou privée __get($name); telle que :
<?php class testa{ protected $name; //使用__set()来管理所有属性 public function __set($pro_name,$pro_val){ //上面$pro_name和$pro_val可自定义 //下面$this->pro_name为既定,不可更改 $this->pro_name=$pro_val; } //使用__get()来获取所有属性值 public function __get($pro_name){ if(isset($pro_name)){ return $this->pro_name; } else { return null; } } } $n1=new testa(); //正常情况,类外部是不能访问protected属性的, 但是用了上面的方法就可以对它们进行操作 $n1->name='小三'; echo $n1->name; ?>
2. Propriété d'héritage
Comme le montre l'exemple ci-dessus, lorsque plusieurs classes ont de nombreux attributs et méthodes communs,
<?php class Pupil{ public $name; protected $age; public function getinfo(){ echo $this->name.'||'.$this->age; } public function testing(){ echo 'this is pupil'; } } class Graduate{ public $name; protected $age; public function getinfo(){ echo $this->name.'||'.$this->age; } public function testing(){ echo 'this is Graduate'; } } ?>la complexité du code Faible convivialité, redondance du code, pensez à la méthode de traitement en css Solution : héritage
Comme on peut Comme le montre ce qui précède, l'héritage est une sous-classe (Subclass) via extends La classe parent
<?php class Students{ public $name; public $age; public function __construct($name,$age){ $this->name=$name; $this->age=$age; } public function showinfo(){ echo $this->name.'||'.$this->age; } } class Pupil extends Students{ function testing(){ echo 'Pupil '.$this->name.' is testing'; } } class Graduate extends Students{ function testing(){ echo 'Graduate '.$this->name.' is testing'; } } $stu1=new Pupil('张三',20); $stu1->showinfo(); echo '<br/>'; $stu1->testing(); ?>hérite des attributs et méthodes publics et protégés de la classe parent (BaseClass) ne peut pas hériter des attributs privés. et méthodes Structure grammaticale :
class 父类名{} class 子类名 extends 父类名{}
Détails :
2. en créant un objet sous-classe, sa classe parent ne sera pas automatiquement appelée par défaut Constructeur
<?php class A{ public $name='AAA'; } class B extends A{ public $age=30; } class C extends B{} $p=new C(); echo $p->name;//这里会输出AAA ?>Exemple :
S'il n'y a pas de constructeur en B, le
class A{ public function __construct(){ echo 'A'; } } class B extends A{ public function __construct(){ echo 'B'; } } $b=new B();//这里会优先输出B中的构造方法,en A sera affiché. 3. Si vous devez accéder à la classe parent dans la méthode de sous-classe (le modificateur de la méthode constructeur et de la méthode membre est protégé ou privé), alors vous pouvez utiliser la méthode parent class :: nom ou parent : nom de la méthode à compléter Ici parent et The self mentionné ci-dessus sont tous en minuscules, et une erreur est signalée en majuscule]
5. la sous-classe (classe dérivée) est exactement la même que la méthode de la classe parent (publique, protégée),
class A{ public function test(){ echo 'a_test'; } } class B extends A{ public function __construct(){ //两种方法都行 A::test(); parent::test(); } } $b=new B();Nous l'appelons méthode override ou méthode override (override), regardez le polymorphisme suivant 3. Polymorphisme Exemple :
Résumé :
<?php class Animal{ public $name; public $price; function cry(){ echo 'i don\'t know'; } } class Dog extends Animal{ //覆盖、重写 function cry(){ echo 'Wang Wang!'; Animal::cry();//这里不会报错,能正确执行父类的cry(); } } $dog1=new Dog(); $dog1->cry(); ?>1. Lorsqu'une classe parent sait que toutes les sous-classes ont une méthode, mais la classe parent. ne sait pas comment écrire la méthode, il peut laisser la sous-classe remplacer sa méthode, remplacer la méthode ( Rewrite), le nom de la méthode et le nombre de paramètres de la sous-classe doivent être exactement les mêmes 2. veut appeler une méthode de la classe parent (protégée/publique), vous pouvez utiliser le nom de la classe parent :: nom de la méthode ou parent :: nom de la méthode 3. Lors de l'implémentation de la réécriture de méthode, les modificateurs d'accès peuvent être différent, mais les droits d'accès de la méthode de la sous-classe doivent être supérieurs ou égaux aux droits d'accès de la méthode de la classe parent (c'est-à-dire qu'ils ne peuvent pas être réduits Droits d'accès des méthodes de la classe parent) Si la classe parent public function cry(){} et la sous-classe protected function cry(){} signaleront une erreur Mais les droits d'accès de la sous-classe peuvent être élargis :
. Ce qui précède est le contenu (avancé) de l'apprentissage des trois principales fonctionnalités orientées objet de PHP (encapsulation, héritage, polymorphisme). Pour plus de contenu connexe, veuillez faire attention au site Web chinois de PHP (www.php. cn) !
父类private function cry(){} 子类 protected function cry(){} 可以正确执行