ホームページ  >  記事  >  バックエンド開発  >  オブジェクト指向phpにはどのような特徴があるのでしょうか? PHP のオブジェクト指向機能の紹介 (コード)

オブジェクト指向phpにはどのような特徴があるのでしょうか? PHP のオブジェクト指向機能の紹介 (コード)

不言
不言オリジナル
2018-07-24 16:19:012707ブラウズ

ここで言う PHP オブジェクト指向は、正確には PHP オブジェクト指向プログラミングと呼ぶべきです。PHP オブジェクト指向プログラミングの 3 つの基本的な特徴は、カプセル化、継承、ポリモーフィズムです。オブジェクト指向の側面を見てみましょう。 PHP 単体. 大きな特徴は 3 つあります。

1. PHP オブジェクト指向の 3 つの主要な特徴:
1. カプセル化:
カプセル化とは、抽象化されたデータとデータ操作をカプセル化することであり、データは内部的に保護されます。プログラムは、承認された操作 (メンバー メソッド) を通じてのみデータを操作できます。

アクセス制御文字割り当て値.png

2. 継承:
いわゆる継承とは、サブクラスが親クラスを拡張することです。親クラス 一部の (パブリック/プロテクト) プロパティおよび (パブリック/プロテクト) メソッドが継承されます。プライベートは継承できません。

  作用:增加代码复用性,管理代码成本低。
 
  基本语法:
  class 类名 extends 父类名 {
        //需要的非私有属性和方法
  }

Inheritance.png

<?php
    
    //父类
    Class Student {
        public $name;
        protected $age;
        protected $grade;

        // public __construct() {

        // }

        public function showInfo() {
            echo $this -> name."<br/>".$this -> age;
        }
    }

    /**
    * 小学生
    */
    class Pupil extends Student
    {
        public function test() {
            echo "<br/>小学生在考试。。。";
        }
    }

    /**
    * 大学生
    */
    class Graduate extends Student
    {
        public function test() {
            echo "<br/>大学生在考试。。。";
        } 
    }

    $stu1 = new Pupil();
    $stu1 -> name = "lizzy";
    $stu1 -> test();
    $stu1 -> showInfo();

    $stu2 = new Graduate();
    $stu2 -> name = "zxm";
    $stu2 -> test();
    $stu2 -> showInfo();
?>

注:
(1) 保護されたプロパティとメソッドは保護されており、サブクラスで直接呼び出すことはできません。サブクラスで定義されます。

Class ParentClass {
    public $name = &#39;lizzy&#39;;
    protected $age = 24;
    private $sex = "女";

    public function test1() {
        echo "<br/>展示public方法";
    }

    protected function test2() {
        echo "<br/>展示protected方法";
    }

    private function test3() {
        echo "<br/>展示private方法";
    }
}

Class SubClass extends ParentClass {
    function show() {
        echo "age=".$this->age;
        // echo "sex=".$this->sex;//是不能继承下来的
        $this -> test2();
    }
}

$sub1 = new SubClass();
$sub1 -> show();
$sub1 -> test1();

(2) サブクラスが親クラスのコンストラクターまたは他のメソッド (パブリック/プロテクト) を呼び出すようにする場合は、クラス名::メソッド名; または親::メソッド名;

を使用できます。
Class A {
    public $n1=90;

    public function __construct() {
        echo "A的构造方法";
    }
}

Class B extends A {
    function __construct() {
        echo "B的构造方法";
        //调用父类的两种方法
        // A::__construct();
        parent::__construct();
    }
}
$b = new B();

(3) サブクラスのメソッドが親クラスのメソッド (プロテクト/パブリック) と完全に一致している場合、それをメソッドの上書き (再書き込み) と呼びます。

3. ポリモーフィズム:
「オーバーロード」はクラスのポリモーフィズムの現れで​​す;
オーバーロードの概念: 関数名は同じですが、関数の数またはパラメーターの型が異なります。 、同じ関数名を呼び出しますが、異なる関数を区別できます。

マジック関数 __call ですが、その使用はお勧めできません。オブジェクトが特定のメソッドを呼び出し、そのメソッドが存在しない場合、システムは自動的に __call を呼び出します。

<?php

    Class A {

        public function test1($p) {
            echo "接收一个参数<br/>";
        }

        public function test2($p) {
            echo "接收两个参数<br/>";
        }

        //提供__call 它一个对象调用某个方法,而该方法不存在,则系统会自动调用__call
        function __call($method,$p) {
            if ($method == "test") {
                if (count($p) == 1) {
                    $this -> test1($p);
                } elseif (count($p) == 2) {
                    $this -> test2($p);
                }
            }
        }
    }

    $a = new A();
    $a -> test(1);
    $a -> test(21,43)
?>

共通のマジック定数: 2 つのアンダースコア LINE 2 つのアンダースコア; 現在の行数;
2 つのアンダースコア FILE 2 つのアンダースコア; 現在のファイルの絶対パス;

メソッドの書き換え /オーバーライド:
1. すべてのサブクラスにメソッドがあることが親クラスでわかっているが、そのメソッドの書き方がわからない場合、サブクラスにこのメソッドをオーバーライドさせることができます。
次のように使用します:

<?php

    Class Animal {
        function cry() {
            echo "不知道怎么叫";
        }
    }

    //重写
    Class Dog extends Animal {
        function cry() {
            echo "小狗汪汪叫";
        }
    }

    //重写
    Class Pig extends Animal {
        function cry() {
            echo "小猪哼哼叫";
        }
    }

    $dog = new Dog();
    $dog -> cry();
    $pig = new Pig();
    $pig -> cry();

?>

メソッド書き換えの詳細:
1. 書き換えられたサブクラスの関数名およびパラメーターの数は、親クラスのものと一致している必要がありますが、パラメータが同じである必要はありません。
2. サブクラスが親クラス (パブリック/プロテクト) のメソッドを呼び出したい場合は、parent::method name(); または親 class name::method name(); を使用し、パラメータを渡すことができます。状況に応じて。
3. メソッド カバレッジを実装する場合、アクセス修飾子は異なっていてもかまいませんが、サブクラスのアクセス スコープ >= 親クラスのアクセス スコープを満たす必要があります。

ポリモーフィズムは以下に反映されます:
サブクラスが親クラスのメソッドをオーバーライドしない場合、サブクラスは親クラスを呼び出します。サブクラスが親クラスのメソッドをオーバーライドする場合、サブクラスは独自のメソッドを呼び出します。 . .

関連する推奨事項:

PHP ゼロベースの入門チュートリアル

PHP におけるオブジェクト指向についての私の理解を話します

以上がオブジェクト指向phpにはどのような特徴があるのでしょうか? PHP のオブジェクト指向機能の紹介 (コード)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。