前回の基本的な記事で、K は PHP での配列と文字列の使用法を紹介しました。今回、K はそれを 1 回限りのリリースとして、PHP の 3 つの主要なオブジェクト指向機能を共有することにしました。カプセル化、継承、ポリモーフィズムの 3 つの側面です。
PHP では、カプセル化は 3 つのサブセクションに要約できます: プライベート化。具体的には、アクセス制御は、アクセス修飾子による外部アクセスを必要としないクラス内のプロパティとメソッドをプライベート化することによって実現されます。
それでは、カプセル化の機能とは何でしょうか?カプセル化には主に 2 つの機能があります。1 つは、ユーザーが関心のある機能を公開し、他のユーザーが使用できない機能を隠す属性カプセル化です。もう 1 つは、ユーザーのデータを制御し、不正なデータ転送を防止します。設定。
では、カプセル化操作はどのように実装されているのでしょうか?メソッドのカプセル化には、メソッドの前に
privateキーワードを追加する、つまり民営化することで設定します。デモは次のとおりです:
private function formatName(){} // 这个方法仅仅能在类内部使用$this调用 function showName(){ $this -> formatName(); }
まず、独自に提供されている set/get メソッドを通じて、
プライベート化されたプロパティを設定/読み取りします。デモは次のとおりです:
private $age; function setAge($age){ $this -> age = $age; } function getAge(){ return $this -> age; }
マジックメソッドで実装されます。デモは以下の通りです:
private $age;function __get($key){return $this -> $key; }function __set($key,$value){$this -> $key = $value; }$对象 -> age; >>> 访问对象私有属性时,自动调用__get()魔术方法,并且将访问的属性名传给__get()方法;$对象 -> age = "11"; >>> 设置对象的私有属性时,自动调用__set()魔术方法,并且将设置的属性名以及属性值传给__set()方法;
① __set(): クラスのプライベートプロパティに値を代入する際に自動的に呼び出され、呼び出し時にオブジェクトに2つのパラメータを渡し、設定する必要がある属性名と属性値
② __get(): クラスのプライベート属性を読み取るときに自動的に呼び出されます。呼び出し時に、メソッドにパラメータを渡します。読み込む必要がある属性名
③ __isset(): isset を外部で使用する () 関数はプライベート属性を検出したときに自動的に呼び出されます。
>>> デフォルトでは検出されないプライベートプロパティを検出するには、クラスの外で isset() を使用します。それは false です
>>>そこで、 __isset() 関数を使用して、自動的に呼び出されたときに内部検出結果を返すことができます。
function __isset($key){
return isset($this->$key);
}
isset($object name->private property)を外部で検出に使用する場合、上記の __isset() によって返された結果が自動的に呼び出されます。
④ __unset(): unset() 関数がプライベート属性を削除するために外部で使用されるときに自動的に呼び出されます。
Function __unset($key){
unset($this->$key);
}
unset($object name->private Attribute)を使用して外部から属性を削除する場合、属性名を自動的に __unset() に渡し、このマジック メソッドに処理させます。
extends という単語で要約することもできます。 Extends はサブクラスで使用され、サブクラスが親クラスから非プライベートのプロパティとメソッドを継承できるようにします。デモは次のとおりです:
class Student extends Person{}
但是,在使用继承时,需要注意以下几点:
① 子类只能继承父类的非私有属性。
② 子类继承父类后,相当于将父类的属性和方法copy到子类,可以直接使用$this调用。
③ PHP只能单继承,不支持一个类继承多个类,但是一个类可以进行多层继承。
>>> class Person{}
class Chengnian extends Person{}
class Student extends Chengnian{}
Student类就同时具有了Chengnian类和Person类的属性和方法
下面给大家介绍一下关于方法重写(方法覆盖)的一些知识。
方法覆盖是指子类对继承父类中重名方法的重写或覆盖,而它的实现需要满足两个条件,一是子类继承父类;二是子类重写父类已有方法。
那么如果我想要在调用父类中的方法,应该怎么做?我们可以通过如下代码实现:
parent::方法名();
同理,在子类继承父类时,首先也要调用父类的构造函数来赋值,实现代码如下:
function __construct($name,$age,$school){ parent::__construct($name,$age);$this -> school = $school; }// 其中name、age属性继承自父类,school属于子类
在PHP中,多态是最常用到的一种特性。所谓多态,是指同一个东西不同形态的展示。在PHP中,我们这样定义多态,一个类被多个子类继承,如果这个类的某个方法在多个子类中表现不同的功能,那么这种行为我们就称其为多态的实现。
多态的实现必须要满足三个条件:一是子类继承父类,二是子类重写父类的方法,三是父类引用指向子类对象。
多态的实现K用一个小小的demo来给大家进行演示,demo如下:
abstract class Person{abstract function say(); } class Chinese extends Person{ // 条件一:子类继承父类function say(){ // 条件二:子类重写父类方法echo "我说中文!<br>"; } }class English extends Person{ //条件一:子类继承父类function say(){ // 条件二:子类重写父类方法echo "I speak English!<br>"; } } // Person $c = new Chinese(); // 父类引用指向子类对象,PHP中此形式行不通 // Person $e = new English();function func(Person $p){ //PHP中的类型约束只存在与函数的形参$p -> say(); } func(new Chinese()); // 条件三:父类引用指向子类对象func(new English()); // 条件三:父类引用指向子类对象
好了,以上就是K给大家带来的关于PHP面向对象中封装、继承、多态这三个特性的初步理解,如果对你有帮助的话,可不要忘了给K点个赞哟~
以上がPHP の予備的な理解 - カプセル化、継承、ポリモーフィック機能の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。