***


1.クラスとオブジェクト
クラスはオブジェクト向けプログラム設計の基本概念であり,通俗的な理解クラスは現実のある種類のものに対する抽象である.例えば、自動車は名前、タイヤ、速度、重量などの属性を持ち、シフト、前進、後退などの操作方法があると抽象化することができる.
クラスは一つのものの構造記述であり、抽象的な概念である.オブジェクトは、物事の具体的な例です.例えば自動車という名詞は自動車の総類と理解できるが、この自動車は具体的な自動車対象である.
クラスは、プログラムを再利用可能にします.
2.クラスとオブジェクトの作成
①クラスの定義方法
class   {
             
}

例:
<?php //        class Car { //     public $name = '  '; //     public function getName() { //        $this               return $this->name; } }

②オブジェクトの作成方法
クラスのインスタンスを作成するには、newキーを使用してオブジェクトを作成します(推奨):
$    = new   ();

変数を使用して作成することもできます.
$   1 = '  ';
$   2 = new $   1();

例:
//     car  
$car = new Car();
//      
$className = 'Car';
$car = new $className();
$car->name = '  A6'; //        
echo $car->getName();  //               

3.クラスの属性
  • クラスで定義された変数を属性と呼び、通常、属性はデータベース内のフィールドと一定の関連があるため、「フィールド」とも呼ばれます.
  • プロパティの変数は、初期化のデフォルト値を設定できます.デフォルト値は定数でなければなりません.

  • ①属性の宣言
    属性宣言は、キーワードpublic、protectedまたはprivateで始まり、その後、通常の変数宣言で構成されます.
    アクセス制御のキーワードは、public:公開されたprotected:保護されたprivate:プライベート
    例:
    class Car {
        //      
        public $name = '  ';
    
        //        
        protected $corlor = '  ';
    
        //      
        private $price = '100000';
    }

    ②アクセス対象の属性又は方法
    一般的には->オブジェクトオペレータを使用します.
    静的プロパティ:使用::二重コロンアクセス.
    例:
    $car = new Car();
    echo $car->name;   //       
    echo $car->color;  //                
    echo $car->price;  //              
  • 保護された属性およびプライベート属性は、外部呼び出しを許可しないが、クラスのメンバーメソッドの内部で呼び出すことができる.
  • クラスメンバーメソッド内で呼び出されると、$this擬似変数を使用して現在のオブジェクトのプロパティを呼び出すことができます.
  • class Car{
        private $price = '1000';
        public function getPrice() {
            return $this->price; //        
    ​    }
    }

    4.クラスを定義する方法
    メソッドはクラス内のfunctionであり,メソッドと関数の違いが分からないことが多いが,プロセス向けのプログラム設計ではfunctionを関数,オブジェクト向けではfunctionをメソッドと呼ぶ.
    アクセス制御のキーワードは、(属性と同じ)public:公開されたprotected:保護されたprivate:プライベート
    例:
    class Car {
        public function getName() {
            return '  ';
        }
    ​}
    $car = new Car();
    echo $car->getName();

    ❤キーワードstatic修飾を使用して静的メソッドと呼ばれ、静的メソッドはオブジェクトをインスタンス化する必要がなく、クラス名で直接呼び出すことができ、オペレータは2つのコロン:::.
    class Car {
        public static function getName() {
            return '  ';
        }
    ​}
    echo Car::getName(); //   “  ”

    5.コンストラクション関数と解析関数
    ①コンストラクタ
    PHP 5はクラスで使用できる_construct()は構造関数を定義します.コンストラクション関数を持つクラスは、オブジェクトが作成されるたびに呼び出されるため、オブジェクトが作成されるたびに初期化作業を行うためによく使用されます.
    class Car {
       function __construct() {
           print "       
    "
    ; } } $car = new Car(); // __construct,

    サブクラスで__が定義されている場合constructでは親クラスは呼び出されません.constructは、親クラスのコンストラクション関数を同時に呼び出す必要がある場合はparent:_を使用する必要があります.construct()明示的な呼び出し.
    class Car {
       function __construct() {
           print "         
    "
    ; } } class Truck extends Car { function __construct() { print "
    "
    ; parent::__construct(); } } $car = new Truck();

    ②解析関数
    同様に、PHP 5は構造関数をサポートし、__を使用する.destruct()を定義します.構造関数とは、オブジェクトのすべての参照が削除されたり、オブジェクトが明示的に破棄されたりしたときに実行される関数です.
    class Car {
       function __construct() {
           print "        
    "
    ; } function __destruct() { print "
    "
    ; } } $car = new Car(); // echo ' , car
    '
    ; unset($car); //

    PHPコードの実行が完了すると、自動的にオブジェクトが回収されて破棄されるので、一般的には明示的にオブジェクトを破棄する必要はありません.
    6.Static静的キーワード
    静的プロパティとメソッドは、クラスをインスタンス化せずに呼び出すことができます.
    クラス名:メソッド名
    静的プロパティでは、オブジェクトが->オペレータ呼び出しを使用することはできません.
    例:
    class Car {
        private static $speed = 10;
    
        public static function getSpeed() {
            return self::$speed;  //        ,   self::   
        }
    }
    echo Car::getSpeed();  //      

    静的メソッドは、変数を使用して動的に呼び出すこともできます.
    $func = 'getSpeed';
    $className = 'Car';
    echo $className::$func();  //        

    静的メソッドでは、$this擬似変数は使用できません.self,parent,staticを使用して、静的メソッドと属性を内部で呼び出すことができます.
    class Car {
        private static $speed = 10;
    
        public static function getSpeed() {
            return self::$speed;
        }
    
        public static function speedUp() {
            return self::$speed+=10;
        }
    }
    class BigCar extends Car {
        public static function start() {
            parent::speedUp();
        }
    }
    
    BigCar::start();
    echo BigCar::getSpeed();

    7.アクセス制御
    公有として定義されたクラスメンバー(public)は、どこでもアクセスできます.保護されたクラスメンバー(protected)として定義されると、その子クラスと親クラスにアクセスできます.プライベートとして定義されたクラスメンバー(private)は、定義されたクラスのみにアクセスできます.
    ①クラス属性
    公有、保護、私有の1つとして定義する必要があります.PHP 5以前のバージョンに対応するため、var定義を採用すると公有とみなされる.
    class Car {
        $speed = 10; //             
        public $name;   //      
    }

    ②クラス内のメソッド
    公有、私有、または保護として定義できます.これらのキーワードが設定されていない場合、このメソッドはデフォルトで公開されます.
    class Car {//       
        function turnLeft() {
        }
    }

    ❤コンストラクション関数がプライベートメソッドとして定義されている場合、オブジェクトを直接インスタンス化することは許可されません.この場合、一般的に静的方法でインスタンス化されます!設計モードでは、単一のインスタンスモードでグローバル一意のオブジェクトしか許可されていないなど、オブジェクトの作成を制御する方法がよく使用されます.
    class Car {
        private function __construct() {
            echo 'object create';
        }
    
        private static $_object = null;
        public static function getInstance() {
            if (empty(self::$_object)) {
                self::$_object = new Car(); //            ,          
            }
            return self::$_object;
        }
    }
    //$car = new Car(); //            
    $car = Car::getInstance(); //             

    8.対象継承
    継承は、オブジェクト向けプログラム設計でよく使用される特性です.
    例えば、自動車は比較的大きなクラスであり、私たちもベースクラスと呼ぶことができます.このほか、自動車はトラック、乗用車、東風、BMWなどに分けられる.これらのサブクラスには同じ属性と方法がたくさんあるため、自動車クラスを継承してこれらの属性と方法を共有し、コードの多重化を実現することができる.
    <?php class Car { public $speed = 0; //        0 public function speedUp() { $this->speed += 10; return $this->speed; } } //     Car Truck ,  speedUp  ,     50 class Truck extends Car{ public function speedUp(){ $this->speed=parent::speedUp()+50; } } $car = new Truck(); $car->speedUp(); echo $car->speed;

    9.重荷重
    リロード:ダイナミックなプロパティとメソッドの作成は、マジックメソッドによって実現されます.
    ①属性の重荷重
    属性が存在しない操作は、次の属性によってそれぞれ実行されます.
  • __set:賦値
  • __get:読み出し
  • __isset:属性が
  • に設定されているかどうかを判断する
  • __unset:プロパティの破棄
  • 例:
    class Car {
        private $ary = array();
    
        public function __set($key, $val) { //   
            $this->ary[$key] = $val;
        }
    
        public function __get($key) {  //  
            if (isset($this->ary[$key])) {
                return $this->ary[$key];
            }
            return null;
        }
    
        public function __isset($key) {  //        
            if (isset($this->ary[$key])) {
                return true;
            }
            return false;
        }
    
        public function __unset($key) {  //     
            unset($this->ary[$key]);
        }
    }
    $car = new Car();
    $car->name = '  ';  //name         
    echo $car->name;
    

    クラスに存在しない属性に値を割り当てると、_setは自動的に実行され、パラメータも自動的に伝達され、動的に作成されたメンバー属性を保存するためにクラスにコンテナを提供できます.存在しない属性にアクセスすると、_getは自動的に呼び出され、この「コンテナ」から探すことができます.見つけたら返します.そうしないとnullを返します._setと_getはマジックメソッドになりますが、論理は自分で実現します.
    ②方法の重荷
    呼び出しが存在しないメソッドが呼び出されると、パラメータ呼び出し__に変わります.callメソッド;存在しない静的メソッドが呼び出されると、__が使用されます.callStaticリロード.
    class Car {
        public $speed = 0;
    
        public function __call($name, $args) {
            if ($name == 'speedUp') {
                $this->speed += 10;
            }
        }
    }
    $car = new Car();
    $car->speedUp(); //             
    echo $car->speed;
    

    1.クラス内の非表示または未定義のメソッドを呼び出そうとすると、クラスで定義された_callというマジックメソッドはこの動作を傍受し、呼び出されたメソッド名を自動的に__に挿入します.callメソッドの最初のパラメータでは、メソッドの実際のパラメータを__に配置します.callメソッドの2番目のパラメータ(パラメータが渡されていない場合、2番目のパラメータは空の配列です).
    2.__callのパラメータは形式パラメータで、パラメータ名はカスタマイズできます.
    10.オブジェクトの詳細プロパティ
    ①対象比較
    同じクラスの2つのインスタンスのすべての属性が等しい場合、比較演算子==を使用して判断できます.2つの変数が同じオブジェクトの参照であるかどうかを判断する必要がある場合は、完全演算子==を使用して判断できます.
    class Car {
    }
    $a = new Car();
    $b = new Car();
    if ($a == $b) echo '==';   //true
    if ($a === $b) echo '==='; //false

    ②対象コピー
    特定の場合、キーワードcloneでオブジェクトをコピーできます.この場合_cloneメソッドが呼び出され、このマジックメソッドでプロパティの値が設定されます.
    class Car {
        public $name = 'car';
    
        public function __clone() {
            $obj = new Car();
            $obj->name = $this->name;
        }
    }
    $a = new Car();
    $a->name = 'new car';
    $b = clone $a;
    var_dump($b);

    ③対象シーケンス化
    オブジェクトはserializeメソッドで文字列にシーケンス化され、データを格納または転送することができます.そして、必要に応じてunserializeで文字列を逆シーケンス化してオブジェクトに使用します.
    class Car {
        public $name = 'car';
    }
    $a = new Car();
    $str = serialize($a); //         
    echo $str.'<br>';
    $b = unserialize($str); //       
    var_dump($b);