前の言葉
PHP には、オブジェクト指向部分に関連するマジック メソッドが多数あり、これらのメソッドはオブジェクト指向の実装に便利です。この記事では、そのマジック メソッドを紹介します。メソッドの詳細
コンストラクター メソッド
ほとんどのクラスには、コンストラクターと呼ばれる特別なメソッドがあります。オブジェクトが作成されると、自動的にコンストラクターが呼び出されます。このコンストラクターは、通常、いくつかの便利な初期化タスクを実行するために使用されます。
コンストラクターの宣言は、名前が2 つのアンダースコア __construct( )。これは PHP5 での変更であり、PHP4 バージョンでは、コンストラクターの名前はクラス名と同じである必要があります。下位互換性のため、クラスに __construct() という名前のメソッドがない場合、PHP はクラスと同じ名前のメソッドを検索します。
void __construct ([ mixed $args [, $... ]] )
コンストラクターがサブクラスで定義されている場合、コンストラクターはサブクラスで定義されません。暗黙的に呼び出される親クラスのコンストラクター。親クラスのコンストラクターを実行するには、サブクラスのコンストラクターで parent::__construct()
を呼び出す必要があります。サブクラスでコンストラクターが定義されていない場合、通常のクラス メソッド (プライベートとして定義されていない場合) と同様に親クラスから継承されます。
<?phpclass BaseClass { function __construct() { print "In BaseClass constructor "; } }class SubClass extends BaseClass { function __construct() { parent::__construct(); print "In SubClass constructor "; } }
デストラクター メソッド
構築法の反対は破壊法です。デストラクタメソッドはPHP5から新たに追加された内容であり、PHP4にはデストラクタメソッドはありません。デストラクター メソッドは、オブジェクトが破棄される前に自動的に呼び出されるメソッドです。主に、ファイルを閉じる、結果セットを解放するなど、いくつかの特定の操作を実行します。
コンストラクター メソッドと同様に、クラスのデストラクター メソッドは 2 つの underscore__destruct() である必要があります。デストラクターはパラメーターを受け取ることはできません
<?phpclass MyDestructableClass { function __construct() { print "In constructor "; $this->name = "MyDestructableClass"; } function __destruct() { print "Destroying " . $this->name . " "; } }//In constructor Destroying MyDestructableClass$obj = new MyDestructableClass();?>
アクセスできないプロパティ
get()
アクセスできないプロパティ (保護された、プライベート) を読み取ります、__get() が呼び出され、属性名が最初のパラメータ (文字列) としてこのメソッドに渡されます。
publicmixed__get ( string $name )
<?phpclass demo{ protected $protected = 1; public $public = 2; private $private = 3; function __get($name){ echo "111{$name}111<br>"; } }$d1 = new demo;$d1->protected;//111protected111$d1->public;$d1->private;//111private111?>
set()
アクセスできないプロパティ (プロテクト、プライベート) に値を割り当てる場合、__set() が呼び出され、プロパティ名は最初のパラメータを渡します。 (文字列) と 2 番目のパラメータとしての値 (混合) をこのメソッドに
public void __set ( string $name , mixed $value )
<?phpclass demo{ protected $protected = 1; public $public = 2; private $private = 3; function __set($name,$value){ echo "0{$name}0{$value}<br>"; } }
isset()
呼び出し時にアクセスできないプロパティ (protected、private) を処理する場合isset() または empty()、__isset() が呼び出されます
public bool __isset ( string $name )
<?phpclass demo{ protected $protected = 1; public $public = 2; private $private = 3; function __isset($name){ echo "0{$name}0<br>"; } }
unset()
アクセスできないプロパティ (protected、private) が unset() を呼び出すと、 __unset() は
public void __unset ( string $name )
<?phpclass demo{ protected $protected = 1; public $public = 2; private $private = 3; function __unset($name){ echo "0{$name}0<br>"; } }
Object copy
clone() と呼ばれます。
clone() メソッドは、オブジェクトのクローン作成時に自動的に呼び出されます。このメソッドにはパラメータは必要なく、クローンされたコピーを再初期化するために使用できます。
clone() メソッドthis と that の 2 つのオブジェクトへの参照が自動的に含まれます。これはコピー オブジェクトへの参照であり、あれは元のオブジェクトへの参照です
<?php class Person{ private $name; private $sex; private $age; function __construct($name="",$sex="",$age=1){ $this->name= $name; $this->sex = $sex; $this->age = $age; } function __clone(){ $this->name = $this->name."的副本"; } function say(){ echo "我的名字:" .$this->name.",性别:".$this->sex.",年龄:".$this->age."<br>"; } }
String
toString()
__toString() メソッドは、クラスが文字列として扱われるときにクラスがどのように応答するかを決定するために使用されます。これは、文字列表現をすばやく取得する最も便利な方法です。オブジェクト参照を直接出力する際に自動的に呼び出されるメソッドです
public $foo; public function __construct($foo)
{
$ this->foo = $foo;
} } public function __toString() {
return $this->foo;
}
}$class = new TestClass('Hello'); echo $class;//Hello ?>
オブジェクトは存在しません
call()
オブジェクト内のアクセスできないメソッドを呼び出す __call() が呼び出されます
callStatic()
アクセスできないメソッドが静的コンテキストで呼び出される場合、__callStatic() は呼び出されます。
<?phpclass MethodTest { public function __call($name, $arguments) { echo "Calling object method '$name' " . implode(', ', $arguments). " "; } public static function __callStatic($name, $arguments) { echo "Calling static method '$name' " . implode(', ', $arguments). " "; } }
自動ロードクラス
autoload()
PHP5 では、__autoload() を定義できます。この関数は、まだ定義されていないクラスを使用するときに自動的に呼び出されます。この関数を呼び出すことで、スクリプト エンジンは、PHP がエラー
<?phpfunction __autoload($class_name) { require_once $class_name . '.php'; }
Serialization
sleep() # で失敗する前に、必要なクラスをロードする最後のチャンスを得ることができます。
##
在调用serialize()函数将对象串行化时,检查类中是否存在一个魔术方法 __sleep()。如果存在,该方法会先被调用,然后才执行序列化操作。此功能可以用于清理对象,并返回一个包含对象中所有应被序列化的变量名称的数组。如果该方法未返回任何内容,则 NULL 被序列化,并产生一个 E_NOTICE 级别的错误
__sleep()函数不需要接受任何参数,但需要返回一个数组,在数组中包含需要串行化的属性。未被包含在数组中的属性将在串行化时被忽略。如果没有在类中声明__sleep()方法,对象中的所有属性都将被串行化
wakeup()
在调用unserialize()函数将对象反串行化对象时,则会自动调用对象中的__wakeup()方法,用来在二进制串重新组成一个对象时,为新对象中的成员属性重新初始化
wakeup()经常用在反序列化操作中,例如重新建立数据库连接,或执行其它初始化操作
<?phpclass 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('server', 'username', 'password', 'db'); } public function __wakeup() { $this->connect(); } }?>
函数调用
invoke()
当尝试以调用函数的方式调用一个对象时,__invoke()方法会被自动调用
<?phpclass CallableClass { function __invoke($x) { var_dump($x); } }
【补充】
set_state()
当调用var_export()导出类时,set_state()方法会被调用,本方法的唯一参数是一个数组,其中包含按 array('property' => value, ...) 格式排列的类属性
[注意]var_export()返回关于传递给该函数的变量的结构信息,它和var_dump()类似,不同的是其返回的表示是合法的PHP代码,也就是说,var_export返回的代码,可以直接当作php代码赋给一个变量。 而这个变量就会取得和被var_export一样的类型的值
public $var1; public $var2; public static function __set_state($an_array)
{
$obj = new A; $obj->var1 = $an_array['var1']; $obj->var2 = $an_array['var2']; return $obj;
}
}
相关参考:php中文网
以上がphp マジックメソッドの紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。