Exemples détaillés des trois caractéristiques majeures de l'encapsulation, de l'héritage et du polymorphisme en PHP orienté objet

伊谢尔伦
Libérer: 2023-03-11 22:08:02
original
1479 Les gens l'ont consulté

PHP orienté objetTrois caractéristiques majeures de l'apprentissage Objectifs d'apprentissage : Bien comprendre l'abstraction, l'encapsulation, l'héritage, le polymorphisme

Trois caractéristiques majeures de l'orienté objet : l'encapsulation, l'héritage, le polymorphisme en premier comprend brièvement l'abstraction :
Lorsque nous avons défini une classe plus tôt, nous avons en fait extrait les attributs et les comportements communs d'une classe de choses pour former un modèle physique (modèle). Cette méthode d'étude des problèmes s'appelle l'abstraction
Exemples détaillés des trois caractéristiques majeures de l'encapsulation, de l'héritage et du polymorphisme en PHP orienté objet
1. Encapsulation
L'encapsulation consiste à encapsuler ensemble les données extraites et les opérations sur les données. Les données sont protégées en interne, et d'autres parties du programme ne sont que certaines opérations (méthodes) autorisées. peut 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 les sous-classes
protected signifie protégé, seules cette ou ces sous-classes peuvent accéder à 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 propriétés (variables). Si la méthode n'a pas de modificateurs d'accès, elle est par défaut publique et les attributs des membres doivent spécifier l'accès. modificateurs. Il existe également cette façon d'écrire var $name en PHP4, ce qui signifie des attributs publics. Cette façon d'écrire n'est pas recommandée.
Exemple :

Alors maintenant, vous souhaitez accéder à protected et. propriétés externes Que faire des éléments et méthodes privés ? L'approche habituelle consiste à accéder à ces formats variables via des fonctions publiques :
<?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; 
?>
Copier après la connexion


L'ensemble et get here sont juste pour faciliter l'identification, pas nécessaire
public function setxxxx($val){ 
$this->xxxx=$val; 
} 
public function getxxxx(){ 
return $this->xxxx; 
}
Copier après la connexion
Par exemple :



Vous pouvez utiliser echo $p1->getsalary();
public function getsalary(){ 
return $this->salary; //扩展:这里可以调用一些方法,如判断用户名等,正确才给访问 
}
Copier après la connexion
Si vous souhaitez accéder à protégé et privé, vous pouvez également utiliser la méthode suivante, mais elle n'est pas recommandée, tant que vous l'avez compris

set() et get()
set() attribue des valeurs aux attributs protégés ou privés
set($name,$val)
get() obtient la valeur de protected ou private
get($name);
Par exemple :

//Vous pouvez comprendre le code ci-dessus, mais il n'est pas recommandé d'utiliser
<?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; 
?>
Copier après la connexion

2 .Héritage
Regardons d'abord un exemple :

Comme le montre l'exemple ci-dessus, lorsque plusieurs classes ont de nombreux
<?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;; 
} 
} 
?>
Copier après la connexion
attributs et méthodes

communs, le la réutilisabilité du code n'est pas élevée et le code est redondant. Pensez à la méthode de traitement en CSSSolution : Héritage

Comme le montre ce qui précède, l'héritage est une sous-classe (Sous-classe) qui continue la Les attributs et méthodes publics et protégés dans la classe parent (BaseClass) en étendant la classe parent. Les attributs et méthodes privés ne peuvent pas être hérités.
<?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(); 
?>
Copier après la connexion
Structure de syntaxe :

nom de la classe parent {}
le nom de la sous-classe de la classe étend la classe parent. name {}
Détails :
1. Une sous-classe ne peut hériter que d'une classe parent (fait référence ici à l'héritage direct si vous souhaitez hériter des propriétés et des méthodes de plusieurs classes, vous pouvez utiliser l'héritage à plusieurs niveaux <) ; 🎜> Exemple :


2. Lors de la création d'un objet de sous-classe, Par défaut, le constructeur

de sa classe parent ne sera pas automatiquement appelé. Le modificateur du constructeur et de la méthode membre est protégé ou. private), alors vous pouvez utiliser parent class:: nom de la méthode ou parent:: nom de la méthode pour compléter [Ici, parent et moi-même mentionnés auparavant sont tous deux en minuscules, et une erreur sera signalée en majuscules]
<?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 
?>
Copier après la connexion

5. Si la méthode d'une sous-classe (classe dérivée) est exactement la même que la méthode de la classe parent (publique, protégée), nous l'appelons couverture de méthode ou remplacement de méthode. Regardez le polymorphisme ci-dessous
<. 🎜> 3. Polymorphisme

Exemple :
class A{ 
public function construct(){ 
echo &#39;A&#39;; 
} 
} 
class B extends A{ 
public function construct(){ 
echo &#39;B&#39;; 
} 
} 
$b=new B();//这里会优先输出B中的构造方法,如果B中没有构造方法才会输出A中的
Copier après la connexion
<?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(); 
?>
Copier après la connexion

小结:
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 &#39;test1<br/>&#39;; 
} 
function test2($p){ 
echo &#39;test2<br/>&#39;; 
} 
function call($method,$p){ 
//这里$p为数组,上面两个变量名可自定义 
if($method == &#39;test&#39;){ 
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); 
?>
Copier après la connexion


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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal