ホームページ  >  記事  >  バックエンド開発  >  PHPのマジックメソッドの使い方を詳しく解説

PHPのマジックメソッドの使い方を詳しく解説

高洛峰
高洛峰オリジナル
2017-01-06 10:13:341156ブラウズ

PHP では、2 つのアンダースコア __ で始まるメソッドをマジック メソッドと呼びます。これらのメソッドは、PHP において決定的な役割を果たします。 マジックメソッドには、

__construct()、クラスコンストラクター

__destruct()、クラスデストラクター

__call()が含まれます。オブジェクト内でアクセスできないメソッドを呼び出す場合は、静的な方法で

__callStatic()を呼び出します。アクセスできないメソッドを呼び出す場合は、

__callStatic()を呼び出します。 、

__get() を呼び出し、クラスのメンバー変数を取得する場合は

__set() を呼び出し、クラスのメンバー変数を設定する場合は

__isset() を呼び出し、アクセスできないプロパティで isset() を呼び出します。または empty() は、アクセスできないプロパティに対して unset() が呼び出されたときに呼び出されます。

__sleep()、serialize()実行時、この関数が最初に呼び出されます

__wakeup()、unserialize()実行時、この関数が最初に呼び出されます

__toString()、クラスが次の場合の応答メソッド文字列として扱われる

__invoke()、関数

__set_state() を呼び出してオブジェクトを呼び出すときの応答メソッド、この静的メソッドは、クラスをエクスポートするために var_export() が呼び出されるときに呼び出されます。

__clone()、オブジェクトのコピーが完了すると呼び出されます

__construct() と __destruct()

コンストラクターとデストラクターはよく知られており、オブジェクトの作成時と破棄時に呼び出されます。たとえば、ファイルを開き、オブジェクトが作成されたときにファイルを開き、オブジェクトが死んだときにファイルを閉じる必要があります

<?php 
class FileRead
{
 protected $handle = NULL;
 
 function __construct(){
  $this->handle = fopen(...);
 }
 
 function __destruct(){
  fclose($this->handle);
 }
}
?>

これら 2 つのメソッドは、継承時に拡張できます。たとえば、

<?php 
class TmpFileRead extends FileRead
{
 function __construct(){
  parent::__construct();
 }
 
 function __destruct(){
  parent::__destruct();
 }
}
?>

__call() と __callStatic()

オブジェクト内で 1 つを呼び出す これら 2 つのメソッドは、メソッドにアクセスできないときに呼び出され、後者は静的メソッドです。これら 2 つのメソッドは、変数メソッド (変数関数) 呼び出しで使用できます。

<?php
class MethodTest 
{
 public function __call ($name, $arguments) {
  echo "Calling object method &#39;$name&#39; ". implode(&#39;, &#39;, $arguments). "\n";
 }
 
 public static function __callStatic ($name, $arguments) {
  echo "Calling static method &#39;$name&#39; ". implode(&#39;, &#39;, $arguments). "\n";
 }
}
 
$obj = new MethodTest;
$obj->runTest(&#39;in object context&#39;);
MethodTest::runTest(&#39;in static context&#39;);
?>

__get()、__set()、__isset()、__unset()

これら 2 つの関数は、クラスのメンバー変数を取得/設定するときに呼び出されます。例えば、オブジェクト自体のメンバー変数ではなく、オブジェクト変数を別の配列に保存します

<?php 
class MethodTest
{
 private $data = array();
 
 public function __set($name, $value){
  $this->data[$name] = $value;
 }
 
 public function __get($name){
  if(array_key_exists($name, $this->data))
   return $this->data[$name];
  return NULL;
 }
 
 public function __isset($name){
  return isset($this->data[$name])
 }
 
 public function unset($name){
  unset($this->data[$name]);
 }
}
?>

__sleep()と__wakeup()

serialize()とunserialize()を実行すると、この2つは最初の関数として呼び出されます。たとえば、オブジェクトをシリアル化する場合、そのオブジェクトにはデータベース リンクが含まれており、逆シリアル化中にリンク状態を復元したい場合は、これら 2 つの関数を再構築することでリンクを復元できます。例は次のとおりです。

<?php
class Connection 
{
 protected $link;
 private $server, $username, $password, $db;
 
 public function __construct($server, $username, $password, $db)
 {
  $this->server = $server;
  $this->username = $username;
  $this->password = $password;
  $this->db = $db;
  $this->connect();
 }
 
 private function connect()
 {
  $this->link = mysql_connect($this->server, $this->username, $this->password);
  mysql_select_db($this->db, $this->link);
 }
 
 public function __sleep()
 {
  return array(&#39;server&#39;, &#39;username&#39;, &#39;password&#39;, &#39;db&#39;);
 }
 
 public function __wakeup()
 {
  $this->connect();
 }
}
?>

__toString()

オブジェクトを文字列として扱う場合の応答メソッド。たとえば、オブジェクトを出力するには echo $obj; を使用します

<?php
// Declare a simple class
class TestClass
{
 public function __toString() {
  return &#39;this is a object&#39;;
 }
}
 
$class = new TestClass();
echo $class;
?>

このメソッドは文字列のみを返すことができ、このメソッドで例外をスローすることはできません。そうでない場合は、致命的なエラーが発生します。

__invoke()

関数呼び出しでオブジェクトを呼び出す際のレスポンスメソッド。以下の通り

<?php
class CallableClass 
{
 function __invoke() {
  echo &#39;this is a object&#39;;
 }
}
$obj = new CallableClass;
var_dump(is_callable($obj));
?>

__set_state()

var_export()を呼び出してクラスをエクスポートする際に、この静的メソッドが呼び出されます。

<?php
class A
{
 public $var1;
 public $var2;
 
 public static function __set_state ($an_array) {
  $obj = new A;
  $obj->var1 = $an_array[&#39;var1&#39;];
  $obj->var2 = $an_array[&#39;var2&#39;];
  return $obj;
 }
}
 
$a = new A;
$a->var1 = 5;
$a->var2 = &#39;foo&#39;;
var_dump(var_export($a));
?>

__clone()

オブジェクトのコピーが完了すると呼び出されます。例えば、記事「デザインパターンとPHP実装の詳細解説:シングルトンモード」で紹介したシングルトンモードの実装方法では、オブジェクトの複製を防ぐためにこの機能が使用されています。

<?php 
public class Singleton {
 private static $_instance = NULL;
 
 // 私有构造方法 
 private function __construct() {}
 
 public static function getInstance() {
  if (is_null(self::$_instance)) {
   self::$_instance = new Singleton();
  }
  return self::$_instance;
 }
 
 // 防止克隆实例
 public function __clone(){
  die(&#39;Clone is not allowed.&#39; . E_USER_ERROR);
 }
}
?>

マジック定数

PHP の定数のほとんどは変更されませんが、コードの配置場所に応じて変化する 8 つの定数があり、これら 8 つの定数はマジック定数と呼ばれます。

__LINE__、ファイル内の現在の行番号

__FILE__、ファイルの絶対パスとファイル名

__DIR__、ファイルが配置されているディレクトリ

__FUNCTION__、関数名

__CLASS__、 class

__TRAIT__、Trait の名前

__METHOD__、クラスのメソッド名

__NAMESPACE__、現在の名前空間の名前


これらの魔法の定数は、現在の環境情報を取得したり、ログを記録したりするためによく使用されます。

以上がこの記事の全内容です、皆様の学習のお役に立てれば幸いです。

PHP マジックメソッドの使用方法に関する詳細な記事については、PHP 中国語 Web サイトに注目してください。


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