php-クラスとオブジェクト


クラスとオブジェクト
クラスはオブジェクト向けのプログラム設計の基本概念であり、通俗的な理解クラスは現実のある種類のものに対する抽象であり、例えば自動車はクラスとして抽象化することができ、自動車は名前、タイヤ、速度、重量などの属性を持ち、シフト、前進、後退などの操作方法がある.
通常、自動車クラスを定義する方法は、次のとおりです.
class Car {
    $name = '  ';
    function getName() {
        return $this->name;
    }}

クラスは東西の構造記述であり、オブジェクトは東西の具体的な例であり、例えば自動車という名詞は自動車の総クラスと理解できるが、この自動車は具体的な自動車オブジェクトである.
オブジェクトはnewキーワードでインスタンス化されます.
$car = new Car();
echo $car->getName();

クラスはオブジェクトと似ているように見えますが、実際には本質的な違いがあります.クラスは抽象的な概念で、オブジェクトは具体的な例です.クラスはプログラムを再利用可能にする
オブジェクトの作成
クラスはキーワードclassで始まり、クラス名とカッコで始まり、カッコでクラスのプロパティとメソッドを定義します.
クラス名はアルファベットまたは下線の先頭で、後ろにいくつかのアルファベット、数字または下線が続く必要があります.クラス名は意味を表すことができ、名詞または英語の単語を使用することができます.
//     
class Car {
    //    
    public $name = '  ';

    //    
    public function getName() {
        //        $this              
        return $this->name;
    }
}

クラスのインスタンスを作成するには、newキーを使用してオブジェクトを作成します.
$car = new Car();
//          
$className = 'Car';
$car = new $className();

クラスのプロパティ
クラスで定義された変数を属性と呼びます.通常、属性はデータベースのフィールドに関連付けられているため、「フィールド」とも呼ばれます.
属性宣言は、キーワードpublic、protectedまたはprivateで始まり、その後、通常の変数宣言で構成されます.
プロパティの変数は、初期化のデフォルト値を設定できます.デフォルト値は定数でなければなりません.
アクセス制御のキーワードの意味は次のとおりです.
public:公開されたprotected:保護されたprivate:プライベート
class Car {
    //      
    public $name = '  ';

    //        
    protected $corlor = '  ';

    //      
    private $price = '100000';
}

デフォルトはpublicで、外部からアクセスできます.
一般に'->オブジェクトオペレータによってオブジェクトのプロパティまたはメソッドにアクセスし、静的プロパティについては'::'二重コロンを使用してアクセスします.
クラスメンバーメソッド内で呼び出されると、$this擬似変数を使用して現在のオブジェクトのプロパティを呼び出すことができます.
$car = new Car();
echo $car->name;   //       
echo $car->color;  //                echo $car->price;  //              

保護された属性とプライベート属性は外部呼び出しを許可せず、クラスのメンバーメソッドの内部で呼び出すことができます.
class Car{
    private $price = '1000';
    public function getPrice() {
        return $this->price; //            }}

クラスの定義方法
メソッドはクラス内のfunctionであり、メソッドと関数の違いが分からないことが多い.
プロセス向けのプログラム設計ではfunctionを関数と呼ぶ.
オブジェクト向けにfunctionをメソッドと呼ぶ.
プロパティと同様に、クラスのメソッドにもpublic、protected、privateのアクセス制御があります.
アクセス制御のキーワードは、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(); //   “  ”

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

アクセス制御
アクセス制御は、キーワードpublic、protected、privateによって実現される.
公有として定義されたクラスメンバーは、どこでもアクセスできます.
保護されたクラスメンバーとして定義されると、その子と親にアクセスできます.
プライベートとして定義されたクラスメンバーは、定義されたクラスにのみアクセスできます.
クラス属性は、共有、保護、プライベートのいずれかとして定義する必要があります.
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(); //             

オブジェクトの継承
継承はオブジェクト向けのプログラム設計でよく使われる特性であり、自動車は比較的大きなクラスであり、私たちもベースクラスと呼ぶことができる.それ以外に、自動車はトラック、乗用車、東風、BMWなどに分けられる.これらのサブクラスは多くの同じ属性と方法を持っているため、継承自動車クラスを採用してこれらの属性と方法を共有し、コードの多重化を実現することができる.
じゅうか
PHPでのリロードとは,属性とメソッドを動的に作成することであり,マジックメソッドによって実現される.
属性のリロードパス_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;

メソッドのリロードパス_Callは、呼び出しが存在しないメソッドを実装すると、パラメータ呼び出し__に変換されます.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;

オブジェクトの詳細プロパティ
オブジェクト比較は、同じクラスの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);