Heim  >  Artikel  >  Backend-Entwicklung  >  (Fortgeschritten) Lernen Sie die drei Hauptfunktionen von PHP objektorientiert kennen (Kapselung, Vererbung, Polymorphismus)

(Fortgeschritten) Lernen Sie die drei Hauptfunktionen von PHP objektorientiert kennen (Kapselung, Vererbung, Polymorphismus)

黄舟
黄舟Original
2017-02-07 10:02:501364Durchsuche

Das Folgende ist der Text des Artikels:


1. Kapselung

Kapselung dient dazu, die extrahierten Daten und die Operationen an den Daten zusammen zu kapseln . Intern geschützt, können nur autorisierte Vorgänge (Methoden) in anderen Teilen des Programms mit den Daten arbeiten.

php bietet drei Zugriffskontrollmodifikatoren.

öffentlich bedeutet global, zugänglich innerhalb dieser Klasse, außerhalb der Klasse und Unterklassen.

geschützt bedeutet geschützt, nur diese Klasse oder Unterklasse kann Zugriff

private bedeutet privat und kann nur innerhalb dieser Klasse aufgerufen werden

Die oben genannten drei Modifikatoren können sowohl Methoden als auch Attribute (Variablen) ändern. Wenn keine Methode vorhanden ist, ist der Zugriffsmodifikator standardmäßig öffentlich. und Mitgliedseigenschaften müssen Zugriffsmodifikatoren angeben. In PHP4 gibt es auch diese Schreibweise für var $name, was bedeutet, dass öffentliche Attribute nicht empfohlen werden:

🎜>

<?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; 
?>

Was soll ich also tun, wenn ich extern auf geschützte und private Elemente und Methoden zugreifen möchte?

Der übliche Ansatz besteht darin, über öffentliche Funktionen auf diese variablen Formate zuzugreifen:

Set und Get Here dienen nur der einfacheren Identifizierung und sind nicht notwendig.

public function setxxxx($val){ 
    $this->xxxx=$val; 
} 
public function getxxxx(){ 
    return $this->xxxx; 
}
Für Beispiel:

Extern können Sie echo $p1->getsalary();

public function getsalary(){ 
    return $this->salary; 
    //扩展:这里可以调用一些方法,如判断用户名等,正确才给访问 
}
Wenn Sie geschützt und privat zugreifen möchten, können Sie auch die folgende Methode verwenden, aber es wird nicht empfohlen, solange Sie es verstehen

__set() und __get()

__set() weist geschützten oder privaten Attributen Werte zu

__set( $name,$val);

__get() ruft den geschützten oder privaten Wert ab

__get($name);

wie:

<?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. Vererbungseigenschaft

Schauen wir uns zunächst ein Beispiel an:

Wie aus dem obigen Beispiel ersichtlich ist, wenn mehrere Klassen vorhanden sind viele gemeinsame Attribute und Methoden,

<?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;; 
    } 
} 
?>
die Komplexität des Codes Geringe Benutzerfreundlichkeit, Code-Redundanz, denken Sie über die Verarbeitungsmethode in CSS nach

Lösung: Vererbung

Wie möglich Wie aus dem Obigen hervorgeht, handelt es sich bei der Vererbung um eine Unterklasse (Subclass) durch Erweiterungen. Die übergeordnete Klasse

<?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(); 
?>
erbt die öffentlichen und geschützten Attribute und Methoden von der übergeordneten Klasse (BaseClass)

und Methoden

Grammatikstruktur:

class 父类名{} 
class 子类名 extends 父类名{}

Details:

1. Eine Unterklasse kann nur eine übergeordnete Klasse erben (hier bezieht sich auf zur direkten Vererbung); wenn Sie die Attribute mehrerer Klassen und Methoden erben möchten,

können Sie die mehrschichtige Vererbung verwenden

Beispiel:

2 Beim Erstellen eines Unterklassenobjekts wird seine übergeordnete Klasse standardmäßig nicht automatisch aufgerufen. Konstruktor

<?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 
?>
Beispiel:

Wenn in B kein Konstruktor vorhanden ist, wird der

class A{ 
    public function __construct(){ 
        echo &#39;A&#39;; 
    } 
} 
class B extends A{ 
    public function __construct(){ 
        echo &#39;B&#39;; 
    } 
} 
$b=new B();//这里会优先输出B中的构造方法,
in A verwendet 3. Wenn Sie in der Unterklassenmethode auf die übergeordnete Klasse zugreifen müssen (der Modifikator der Konstruktormethode und der Mitgliedsmethode ist geschützt oder privat),

, können Sie die übergeordnete Klasse::-Methode verwenden Name oder Elternteil:: Methodenname zum Vervollständigen

Hier sind Elternteil und Das oben erwähnte Selbst alle in Kleinbuchstaben geschrieben, und ein Fehler wird in Großbuchstaben gemeldet]

5 Wenn die Methode von a Die Unterklasse (abgeleitete Klasse) ist genau die gleiche wie die Methode der übergeordneten Klasse (öffentlich, geschützt).

class A{ 
    public function test(){ 
        echo &#39;a_test&#39;; 
    } 
} 
class B extends A{ 
    public function __construct(){ 
        //两种方法都行 
        A::test(); 
        parent::test(); 
    } 
} 
$b=new B();
Wir nennen es Methodenüberschreibung oder Methodenüberschreibung (Override). Schauen Sie sich den folgenden Polymorphismus an

3. Polymorphismus

Beispiel:


Zusammenfassung:

<?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. Wenn eine übergeordnete Klasse weiß, dass alle Unterklassen eine Methode haben, aber die übergeordnete Klasse Wenn Sie nicht sicher sind, wie die Methode geschrieben werden soll, kann die Unterklasse ihre Methode überschreiben (Rewrite), der Methodenname und die Anzahl der Parameter der Unterklasse müssen genau gleich sein

2 Wenn die Unterklasse Wenn Sie eine Methode der übergeordneten Klasse (geschützt/öffentlich) aufrufen möchten, können Sie den Namen der übergeordneten Klasse::Methodenname oder den Namen der übergeordneten Klasse::Methodenname

verwenden. 3. Bei der Implementierung des Methodenumschreibens können die Zugriffsmodifikatoren sein unterschiedlich, aber die Zugriffsrechte der Methode der Unterklasse müssen größer oder gleich den Zugriffsrechten der Methode der übergeordneten Klasse sein (d. h. sie können nicht reduziert werden). Zugriffsrechte der Methode der übergeordneten Klasse.

Wenn die übergeordnete Klasse Die öffentliche Funktion „cry(){}“ und die durch die Unterklasse geschützte Funktion „cry(){}“ melden einen Fehler

Aber die Zugriffsrechte der Unterklasse können erweitert werden, zum Beispiel:

Das Obige ist der (fortgeschrittene) Inhalt des Erlernens der drei wichtigsten objektorientierten Funktionen von PHP (Kapselung, Vererbung, Polymorphismus). Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website (www.php.cn).

父类private function cry(){} 子类 protected function cry(){} 可以正确执行

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn