ホームページ > バックエンド開発 > PHPチュートリアル > (上級) PHP オブジェクト指向の 3 つの主要な機能 (カプセル化、継承、ポリモーフィズム) を学習します。

(上級) PHP オブジェクト指向の 3 つの主要な機能 (カプセル化、継承、ポリモーフィズム) を学習します。

黄舟
リリース: 2023-03-05 14:14:01
オリジナル
1383 人が閲覧しました

以下は記事の本文です:


1. カプセル化

カプセル化とは、抽出されたデータとそのデータに対する操作を一緒にカプセル化することです。データは内部的に保護されており、プログラムの他の部分は許可された操作のみを持ちます。 (メソッド) ) データを操作します。

php は 3 つのアクセス制御修飾子を提供します

public はグローバルを意味し、このクラス内、クラス外、およびサブクラスからアクセス可能

protected は保護されている、このクラスまたはサブクラスのみがアクセスできるを意味します

private はプライベートを意味します はい、このクラス内でのみアクセス可能

上記の 3 つの修飾子はメソッドとプロパティ (変数) の両方を変更できます。メソッドにアクセス修飾子がない場合は、デフォルトで public にアクセス修飾子を指定する必要があります。これは PHP4 でも使用できます。var $name の記述方法です。は public 属性を表します。この書き方は推奨されません

例:

<?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; 
?>
ログイン後にコピー


それでは、外部から保護された要素やメソッドにアクセスしたい場合はどうすればよいでしょうか?

通常のアプローチは、パブリック関数を通じてこれらの変数形式にアクセスすることです:

public function setxxxx($val){ 
    $this->xxxx=$val; 
} 
public function getxxxx(){ 
    return $this->xxxx; 
}
ログイン後にコピー

ここでの set と get は識別の便宜のためだけであり、必須ではありません

例:

public function getsalary(){ 
    return $this->salary; 
    //扩展:这里可以调用一些方法,如判断用户名等,正确才给访问 
}
ログイン後にコピー

echo $p1-> を使用できます。外部から getsalary() ;

protected および private にアクセスしたい場合は、次のメソッドを使用することもできますが、推奨されません

__set() および __get()

__set() は値を割り当てます。保護されたまたはプライベートな属性に

__set ($name,$val);

__get() は保護されたまたはプライベートな値を取得します

__get($name); 例:

<?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. 継承


まず例を見てみましょう:

<?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;; 
    } 
} 
?>
ログイン後にコピー

上記の例からわかるように、複数のクラスに多くの共通の属性やメソッドがある場合、

コードの再利用性は高くなく、コードが冗長になります。 CSS の処理メソッド

解決策: 継承

<?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(); 
?>
ログイン後にコピー

上記からわかるように、継承は、親クラス

を拡張することで、親クラス (BaseClass) の public および protected 属性とメソッドを継承するサブクラス (Subclass) です。プライベートな属性とメソッドを継承することはできません

文法構造:

class 父类名{} 
class 子类名 extends 父类名{}
ログイン後にコピー

詳細:

1. 複数のプロパティとメソッドを継承したい場合、サブクラスは 1 つの親クラスのみを継承できます。クラス、


多層継承を使用できます

例:

<?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 
?>
ログイン後にコピー

2. サブクラスオブジェクトを作成するとき、その親クラスのコンストラクターはデフォルトでは自動的に呼び出されません

例:

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 のコンストラクターが出力されます

3. サブクラスの親クラスのメソッドにアクセスする必要がある場合 (コンストラクターとメンバー メソッドの修飾子がプロテクトまたはプライベートである場合)、

その後、parent を使用できます。 class::method 名またはparent::method 名を完成させます

ここでparent 前述のselfはどちらも小文字で、エラーは大文字で報告されます]

class A{ 
    public function test(){ 
        echo &#39;a_test&#39;; 
    } 
} 
class B extends A{ 
    public function __construct(){ 
        //两种方法都行 
        A::test(); 
        parent::test(); 
    } 
} 
$b=new B();
ログイン後にコピー

5. サブクラス(派生クラス)のメソッドが正確に親クラスのメソッド (public、protected) と同じです。

これをメソッド カバレッジまたはメソッド オーバーライド (オーバーライド) と呼びます。次のポリモーフィズムを参照してください

3. ポリモーフィズム

例:

<?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. 親クラスがすべてのサブクラスにメソッドがあることを知っているが、そのメソッドの記述方法を決定できない場合、メソッドの上書き (書き換え) にはメソッド名とメソッドの数が必要です。サブクラスのパラメータはまったく同じです


2. サブクラスが親クラスを呼び出したい場合 特定のメソッド (保護/パブリック) に対して、親クラス名::メソッド名または親::メソッド名を使用できます。 3. メソッドの書き換えを実装する場合、アクセス修飾子は異なっていてもかまいませんが、サブクラス メソッドのアクセス権限は、親クラス メソッドのアクセス権限以上である必要があります(つまり、親クラス メソッドのアクセス権限は使用できません)。

親クラスのpublic関数cry(){}とサブクラスのprotected関数cry(){}がエラーを報告する場合

ただし、サブクラスのアクセス権は次のように拡大できます:

父类private function cry(){} 子类 protected function cry(){} 可以正确执行
ログイン後にコピー

上記PHP オブジェクト指向の 3 つの主要な特徴 (カプセル化、継承、ポリモーフィズム) を学習する (上級編) コンテンツです。その他の関連コンテンツについては、PHP 中国語 Web サイト (www.php. cn) に注目してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート