PHPs drei Hauptmerkmale des objektorientierten Lernens Lernziele: Abstraktion, Kapselung, Vererbung, Polymorphismus vollständig verstehen
Die drei Hauptmerkmale des objektorientierten Lernens: Kapselung, Vererbung, Polymorphismus Zuerst einfach verstehen Lass uns reden über Abstraktion:
Als wir zuvor eine Klasse definiert haben, haben wir tatsächlich die gemeinsamen Attribute und Verhaltensweisen einer Klasse von Dingen extrahiert, um ein physisches Modell (Vorlage) zu bilden. Diese Methode zur Untersuchung von Problemen wird Abstraktion genannt
1. Kapselung
Kapselung dient dazu, die extrahierten Daten und die Operationen auf den Daten zusammenzukapseln. Die Daten sind intern geschützt, und andere Teile des Programms verfügen nur über autorisierte Operationen mit 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 Unterklassen können darauf zugreifen
privat bedeutet privat und kann nur Innerhalb dieser Klasse kann auf die drei oben genannten Modifikatoren zugegriffen werden. Wenn die Methode keine Zugriffsmodifikatoren hat, müssen die Mitgliedseigenschaften auch auf diese Weise angegeben werden Schreiben von var $name in PHP4, was öffentliche Attribute bedeutet
Diese Schreibweise wird nicht empfohlen:
Code kopieren Der Code lautet wie folgt:
<?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-> >salary; Sie können hier einige Methoden aufrufen, z. B. den Benutzernamen usw. beurteilen und nur dann Zugriff gewähren, wenn dieser korrekt ist
}
Sie kann echo von außen verwenden $p1->getsalary();
Wenn Sie auf geschützt und privat zugreifen möchten, können Sie auch die folgenden Methoden verwenden, sie werden jedoch nicht empfohlen. Verstehen Sie sie einfach:
__set() und __get ()
__set() weist geschützten oder privaten Attributen Werte zu
__set( $name,$val);
__get() ruft den Wert von protected oder privat ab
__get($name) ;
Zum Beispiel:
Code kopieren
Der Code lautet wie folgt:
//Sie können den obigen Code verstehen, aber er wird nicht empfohlen
2. Vererbung Schauen wir uns zunächst ein Beispiel an:
<?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; ?>
Code kopieren Der Code lautet wie folgt:
Lösung: Vererbung
<?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'; } } ?>
Der Code lautet wie folgt:
Wie aus dem Obigen ersichtlich ist, ist Vererbung eine Unterklasse (Subclass), die die öffentlichen und geschützten Attribute und Methoden in der übergeordneten Klasse (BaseClass) durch die erweiterte übergeordnete Klasse fortsetzt. Private Attribute und Methoden können nicht vererbt werden
Name der übergeordneten Klasse{} Klassenunterklassenname erweitert übergeordneten Klassennamen{} Details:
1. Eine Unterklasse kann nur eine übergeordnete Klasse erben (hier bezieht sich auf die direkte Vererbung). Sie können mehrschichtige Vererbung verwenden<?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(); ?>
Code kopieren
Der Code lautet wie folgt:
2. Erstellen Sie eine Unterklasse Objekt erstellt wird, wird der Konstruktor seiner übergeordneten Klasse nicht automatisch aufgerufen
class A{ public function __construct(){ echo 'A'
}<?php class A{ public $name='AAA'; } class B extends A{ public $age=30; } class C extends B{} $p=new C(); echo $p->name;//这里会输出AAA ?>
Klasse B erweitert A{
öffentliche Funktion __construct(){
echo 'B';}
}
$b=new B();/ /Here , wird der Konstruktor in B zuerst ausgegeben. Wenn es keinen Konstruktor in B gibt, wird der
in A ausgegeben. 3. Wenn Sie auf die Methode der übergeordneten Klasse in der Unterklasse zugreifen müssen (den Modifikator des Konstruktors). und die Mitgliedsmethode geschützt oder privat ist), können Sie zum Vervollständigen den Namen der übergeordneten Klasse::Methode oder den Namen der übergeordneten Methode::Methode verwenden Klasse A{
öffentliche Funktion test(){
echo 'a_test'}
}
Klasse B erweitert A{
öffentliche Funktion __construct(){
// Beide Methoden sind in Ordnung
A::test();
parent::test(}
}
$b=new B(); Unterklasse (abgeleitete Klasse) Wenn die Methode genau mit der Methode der übergeordneten Klasse (öffentlich, geschützt) übereinstimmt, nennen wir sie Methodenüberschreibung oder Methodenüberschreibung (Überschreibung). Siehe den folgenden Polymorphismus
3. Polymorphismus
Beispiel:
Code kopieren
Der Code lautet wie folgt:
<?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、当一个父类知道所有的子类都有一个方法,但是父类不能确定该方法如何写,可以让子类去覆盖它的方法,方法覆盖(重写),必须要求子类的方法名和参数个数完全一致
2、如果子类要去调用父类的某个方法(protected/public),可以使用 父类名::方法名 或者 parent::方法名
3、在实现方法重写的时候,访问修饰符可以不一样,但是子类方法的访问权限必须大于等于父类方法的访问权限(即不能缩小父类方法的访问权限)
如 父类public function cry(){} 子类 protected function cry(){} 则会报错
但是子类的访问权限可以放大,如:
父类private function cry(){} 子类 protected function cry(){} 可以正确执行
扩展:
方法重载(overload)
基本概念:函数名相同,但参数的个数或参数的类型不同,达到调用同一个函数,可以区分不同的函数
在PHP5中虽然也支持重载,但是和其它语言还是有很大区别的,php中不能定义多个同名函数
PHP5中提供了强大的“魔术”函数,使用这些魔术函数,我们可以做到函数重载,
这里我们要到到 __call,当一个对象调一个方法时,而该方法不存在,则程序会自动调用__call
【官方不推荐使用】
PHP中有以下几个魔术常量:__LINE__ __FILE__ __DIR__ __FUNCTION__ __CLASS__ 等
例:
复制代码 代码如下:
<?php class A{ function test1($p){ echo 'test1<br/>'; } function test2($p){ echo 'test2<br/>'; } function __call($method,$p){ //这里$p为数组,上面两个变量名可自定义 if($method == 'test'){ if(count($p)==1){ $this->test1($p); } else if(count($p)==2){ $this->test2($p); } } } } $a=new A(); $a->test(5); $a->test(3,5); ?>
相关推荐:
PHP面向对象五大原则之依赖倒置原则(DIP)详解_php技巧
Das obige ist der detaillierte Inhalt vonLernen Sie die drei Hauptmerkmale der objektorientierten PHP-Methode kennen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!