この記事では、主に PHP の一般的なマジック メソッドの機能と使用方法を紹介します。一定の参考価値があります。今、みんなに共有します。必要な友人は参考にしてください。
概要
オブジェクト指向プログラミングでは、PHP はプログラミングに非常に便利な一連のマジック メソッドを提供します。 PHP のマジック メソッドは通常、__ (2 つのアンダースコア) で始まり、明示的な呼び出しを必要としませんが、特定の条件によってトリガーされます。
始める前に
PHP のマジック メソッドを要約する前に、後の例で使用する 2 つのクラスを定義しましょう:
<?php class Device{ public $name,$battery,$data = [],$connection; protected function connect(){ $this->connection = 'resource'; echo $this->name.'connected'.PHP_EOL; } protected function disconnect(){ $this->connection = null; echo $this->name.'disconnected'.PHP_EOL; } }
Device クラスには 4 つのメンバー属性があります。そして 2 つのメンバーメソッド。
<?php class Battery{ private $charge = 0; public function setCharge($charge){ $charge = (int)$charge; if($charge < 0){ $charge = 0; }else if($charge > 100){ $charge = 100; } $this->charge = $charge; } }
Battery クラスには、1 つのメンバー プロパティと 1 つのメンバー メソッドがあります。
コンストラクターとデストラクター
コンストラクターとデストラクターは、それぞれオブジェクトの作成時と破棄時に呼び出されます。オブジェクトが「破棄される」とは、オブジェクトへの参照がないことを意味します。たとえば、オブジェクトを参照する変数が削除 (設定解除)、再割り当て、またはスクリプトの実行が終了すると、デストラクターが呼び出されます。
__construct()
__construct()コンストラクターは、最も一般的に使用される関数です。オブジェクトを作成するときに、コンストラクターで初期化作業を行うことができます。インスタンス化時に対応する数のパラメーターが渡される限り、コンストラクターには任意の数のパラメーターを定義できます。コンストラクターで例外が発生すると、オブジェクトの作成が妨げられます。
<?php class Device{ public $name,$battery,$data = [],$connection; public function __construct(Battery $battery,$name){ $this->battery = $battery; $this->name = $name; $this->connect(); } protected function connect(){ $this->connection = 'resource'; echo $this->name.'connected'.PHP_EOL; } protected function disconnect(){ $this->connection = null; echo $this->name.'disconnected'.PHP_EOL; } }
上記のサンプル コードでは、Device クラスのコンストラクターがメンバーのプロパティに値を代入し、connect() メソッドを呼び出します。
コンストラクターをプライベート メソッドとして宣言すると、シンプレックス パターンでよく使用されるクラス外でオブジェクトが作成されるのを防ぎます。
__desctruct()
デストラクターは通常、オブジェクトが破棄されるときに呼び出されます。デストラクターはパラメーターを受け取りません。データベース接続を閉じるなど、一部のクリーンアップ作業はデストラクターで実行されることがよくあります。
__get()
存在しないプロパティにアクセスしようとすると、マジック メソッド __get() が呼び出されます。アクセスされた属性の名前を表すパラメーターを受け取り、属性の値を返します。上記の Device クラスには、次のコードに示すように、ここで役割を果たす data 属性があります。
<?php class Device{ public $name,$battery,$data = [],$connection; public function __construct(Battery $battery,$name){ $this->battery = $battery; $this->name = $name; $this->connect(); } protected function connect(){ $this->connection = 'resource'; echo $this->name.'connected'.PHP_EOL; } protected function disconnect(){ $this->connection = null; echo $this->name.'disconnected'.PHP_EOL; } } $battery = new Battery(); $device = new Device($battery,'mac'); echo $device->aaa; //Notice: Undefined property: Device::$aaa
<?phpheader("Content-type: text/html; charset=utf-8"); class Device{ public $name,$battery,$data = [],$connection; public function __construct(Battery $battery,$name){ $this->battery = $battery; $this->name = $name; $this->connect(); } public function __get($name){ if(array_key_exists($name,$this->data)){ return $this->data[$name]; } return '属性不存在'; } protected function connect(){ $this->connection = 'resource'; echo $this->name.'connected'.PHP_EOL; } protected function disconnect(){ $this->connection = null; echo $this->name.'disconnected'.PHP_EOL; } }$battery = new Battery(); $device = new Device($battery,'mac'); echo $device->aaa; //macconnected 属性不存在
このマジック メソッドで最も一般的に使用される場所は、「読み取り専用」メソッドを作成することです。アクセス制御を拡張するためのプロパティ。上記の Battery クラスにはプライベート プロパティ $charge があり、これを __get() マジック メソッドを通じて拡張して、読み取り可能だがクラス外で変更できないようにすることができます。コードは次のとおりです:
<?php class Battery { private $charge = 0; public function __get($name) { if(isset($this->$name)) { return $this->$name; } return null; } }
#__set()
__set() マジック メソッドは、アクセスできないプロパティを変更しようとすると呼び出されます。このメソッドは 2 つのパラメータを受け取ります。 1 つは属性の名前を表し、もう 1 つは属性の値を表します。サンプル コードは次のとおりです。<?php header("Content-type: text/html; charset=utf-8"); class Device{ public $name,$battery,$data = [],$connection; public function __construct(Battery $battery,$name){ $this->battery = $battery; $this->name = $name; $this->connect(); } public function __get($name){ if(array_key_exists($name,$this->data)){ return $this->data[$name]; } return '属性不存在'; } public function __set($name,$value){ $this->data[$name] = $value; } protected function connect(){ $this->connection = 'resource'; echo $this->name.'connected'.PHP_EOL; } protected function disconnect(){ $this->connection = null; echo $this->name.'disconnected'.PHP_EOL; } }$battery = new Battery(); $device = new Device($battery,'mac'); $device->aaa = '哈哈'; echo $device->aaa; //macconnected 哈哈
__isset()
__isset() マジック メソッドは、アクセスできないプロパティに対して isset() メソッドが呼び出されたときに呼び出されます。属性の名前を示すパラメータを受け取ります。プロパティが存在するかどうかを示すブール値を返す必要があります。コードは次のとおりです。<?php class Device{ private function __isset($name){ return array_key_exists($name,$this->data); }
__unset()
__unset() マジック メソッドに __isset() メソッドを追加する必要があります。 () 関数は、アクセスできないプロパティを破棄するときに呼び出され、プロパティの名前を表すパラメータを受け取ります。 上記がこの記事の全内容です。皆様の学習に少しでもお役に立てれば幸いです。その他の関連コンテンツについては、PHP 中国語 Web サイトをご覧ください。 関連する推奨事項:PHP のマジック定数 (変数)、マジック メソッド (関数)、およびスーパーグローバル変数の概要
以上がPHP での一般的なマジック メソッドの関数と使用法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。