Maison  >  Article  >  développement back-end  >  (Avancé) Apprendre les trois fonctionnalités majeures du PHP orienté objet (encapsulation, héritage, polymorphisme)

(Avancé) Apprendre les trois fonctionnalités majeures du PHP orienté objet (encapsulation, héritage, polymorphisme)

黄舟
黄舟original
2017-02-07 10:02:501373parcourir

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(&#39;张三&#39;,20,3000); 
//这里属于类外部,那么如果用下面的方法访问age和salary都会报错 
// echo $p1->age; echo$p1->salary; 
?>
<.>


Alors, que dois-je faire si je souhaite accéder à des éléments et méthodes protégés et privés en externe ?

L'approche habituelle consiste à accéder à ces formats variables via des fonctions publiques :

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=&#39;小三&#39;; 
echo $n1->name; 
?>

2. Propriété d'héritage

Regardons d'abord un exemple :

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.&#39;||&#39;.$this->age; 
    } 
    public function testing(){ 
        echo &#39;this is pupil&#39;; 
    } 
} 
class Graduate{ 
    public $name; 
    protected $age; 
    public function getinfo(){ 
        echo $this->name.&#39;||&#39;.$this->age; 
    } 
    public function testing(){ 
        echo &#39;this is Graduate&#39;; 
    } 
} 
?>
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.&#39;||&#39;.$this->age; 
    } 
} 
class Pupil extends Students{ 
    function testing(){ 
        echo &#39;Pupil &#39;.$this->name.&#39; is testing&#39;; 
    } 
} 
class Graduate extends Students{ 
    function testing(){ 
        echo &#39;Graduate &#39;.$this->name.&#39; is testing&#39;; 
    } 
} 
$stu1=new Pupil(&#39;张三&#39;,20); 
$stu1->showinfo(); 
echo &#39;<br/>&#39;; 
$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 :

1. Une sous-classe ne peut hériter que d'une seule classe parent (ici fait référence pour diriger l'héritage); si vous souhaitez hériter des attributs de plusieurs classes et méthodes,

peut utiliser l'héritage multicouche

Exemple :

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=&#39;AAA&#39;; 
} 
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 &#39;A&#39;; 
    } 
} 
class B extends A{ 
    public function __construct(){ 
        echo &#39;B&#39;; 
    } 
} 
$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 &#39;a_test&#39;; 
    } 
} 
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 &#39;i don\&#39;t know&#39;; 
    } 
} 
class Dog extends Animal{ 
    //覆盖、重写 
    function cry(){ 
        echo &#39;Wang Wang!&#39;; 
        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(){} 可以正确执行

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