PHPのあれらのマジックの方法(二)
3499 ワード
上記では、非常によく使われ、面接でも人気のあるマジックの方法を紹介しましたが、この文章で紹介されているのはそれほどよく使われていないかもしれませんが、絶対にプラスポイントです.これらの方法や役割を正確に言えるときは、相手がもっと目を見張ることができると信じています.
__sleep()と_wakeup()
字面上の意味はとても面白くて、寝て起きます.これらはそれぞれserialize()とunserialize()メソッド、すなわちシーケンス化と逆シーケンス化の両方に対応しており、この2つのマジックメソッドがトリガーされます.
ここで注意しなければならないのは、sleep()はクラス内の属性名に対応する配列を返す必要があります.通常、これらは、シーケンス化前にデータのクリーンアップ作業を行うか、逆シーケンス化前にデータの前処理作業を行うことができる.たとえば、シーケンス化前にデータベース接続を閉じるか、逆シーケンス化前にデータベース接続を開きます.
__toString()
名前の通り、この方法は文字列を返すことで、オブジェクトの印刷を実現します.この方法が実装されていない場合、echoを直接使用してもオブジェクトを印刷できないため、エラーが発生します.このマジックメソッドが実装されると,echoやprintなどのメソッドをそのまま用いてこのマジックメソッドに入り,そのメソッドで返される内容を印刷することができる.
もちろん、$obj=new Object()$obj=new Object()$a = 'this is ' . $obj;このように使います.
__invoke()
興味深いマジックメソッドで、オブジェクトをメソッドとして使用するとこのマジックメソッドが呼び出されます.どういう意味ですか.例:$obj=new Object();そして直接$obj()
このとき、このマジックメソッドに入ります.では、何の役に立つのでしょうか.このマジックメソッドは、閉パケットおよび反射にとってかけがえのない役割を果たす.将来は別の文章で詳しく説明します.
__clone()
cloneキーを使用してオブジェクトのコピーを行うと、このマジックメソッドが呼び出されます.実はプロトタイプモードの実現です.プロトタイプパターンに関する記事ではさらに詳しく説明します.
__set_state()と_debugInfo()
本当に不思議なPHP文法で、最後にこの2つのマジック方法の1つは下線で命名され、1つはアルパカの峰を使っています.本当に突っ込む力がない~~
この2つの方法はvar_に対応していますexport()とvar_dump()メソッドの使用時の呼び出し.一般的にはデバッグ時に使用されますが、実はとても似ています.toString()メソッド.
2つの文章を通して,PHPが定義したこれらのマジック法を熟知した.ここで特に注意が必要なのは、PHPでは全てを_2つの下線の先頭のメソッドは、マジックメソッドの保存名として使用されます.クラスメソッドを定義するときは、2つの下線で始まるメソッド名を使用しないでください.
文書参照:https://www.php.net/manual/zh/language.oop5.magic.php
フルコード:https://github.com/zhangyue0503/php/blob/master/newblog/PHPMagic.php
公衆番号に注目:【ハードコアプロジェクトマネージャ】最新の文章を取得
追加微信/QQ朋友:【xiaoyuezigonggong/149844827】無料PHP、プロジェクト管理学習資料
知乎、公众号、震音、头条搜索【硬核プロジェクトマネージャー】
B局ID:482780532
__sleep()と_wakeup()
字面上の意味はとても面白くて、寝て起きます.これらはそれぞれserialize()とunserialize()メソッド、すなわちシーケンス化と逆シーケンス化の両方に対応しており、この2つのマジックメソッドがトリガーされます.
ここで注意しなければならないのは、sleep()はクラス内の属性名に対応する配列を返す必要があります.通常、これらは、シーケンス化前にデータのクリーンアップ作業を行うか、逆シーケンス化前にデータの前処理作業を行うことができる.たとえば、シーケンス化前にデータベース接続を閉じるか、逆シーケンス化前にデータベース接続を開きます.
public function __sleep()
{
echo '===sleep===' . PHP_EOL;
echo ' serialize() , ' . PHP_EOL;
echo '===unset===' . PHP_EOL;
return ['a'];
}
public function __wakeup()
{
echo '===wakeup===' . PHP_EOL;
echo ' unserialize() , ' . PHP_EOL;
echo '===wakeup===' . PHP_EOL;
}
__toString()
名前の通り、この方法は文字列を返すことで、オブジェクトの印刷を実現します.この方法が実装されていない場合、echoを直接使用してもオブジェクトを印刷できないため、エラーが発生します.このマジックメソッドが実装されると,echoやprintなどのメソッドをそのまま用いてこのマジックメソッドに入り,そのメソッドで返される内容を印刷することができる.
public function __toString()
{
echo '===toString===' . PHP_EOL;
echo ' echo、print ' . PHP_EOL;
echo '===toString===' . PHP_EOL;
return ' ';
}
もちろん、$obj=new Object()$obj=new Object()$a = 'this is ' . $obj;このように使います.
__invoke()
興味深いマジックメソッドで、オブジェクトをメソッドとして使用するとこのマジックメソッドが呼び出されます.どういう意味ですか.例:$obj=new Object();そして直接$obj()
このとき、このマジックメソッドに入ります.では、何の役に立つのでしょうか.このマジックメソッドは、閉パケットおよび反射にとってかけがえのない役割を果たす.将来は別の文章で詳しく説明します.
public function __invoke()
{
echo '===invoke===' . PHP_EOL;
echo ' ' . PHP_EOL;
echo '===invoke===' . PHP_EOL;
}
__clone()
cloneキーを使用してオブジェクトのコピーを行うと、このマジックメソッドが呼び出されます.実はプロトタイプモードの実現です.プロトタイプパターンに関する記事ではさらに詳しく説明します.
public function __clone()
{
echo '===clone===' . PHP_EOL;
echo ' ' . PHP_EOL;
echo '===clone===' . PHP_EOL;
}
__set_state()と_debugInfo()
本当に不思議なPHP文法で、最後にこの2つのマジック方法の1つは下線で命名され、1つはアルパカの峰を使っています.本当に突っ込む力がない~~
この2つの方法はvar_に対応していますexport()とvar_dump()メソッドの使用時の呼び出し.一般的にはデバッグ時に使用されますが、実はとても似ています.toString()メソッド.
public static function __set_state($an_array)
{
echo '===set_state===' . PHP_EOL;
echo ' var_export() ' . PHP_EOL;
echo '===set_state===' . PHP_EOL;
$m = new PHPMagic();
$m->var1 = 111;
$m->var2 = 222;
return $m;
}
public function __debugInfo()
{
echo '===debugInfo===' . PHP_EOL;
echo ' var_dump() ' . PHP_EOL;
echo '===debugInfo===' . PHP_EOL;
return [
'var1' => $this->var1,
'var2' => $this->var2,
];
}
2つの文章を通して,PHPが定義したこれらのマジック法を熟知した.ここで特に注意が必要なのは、PHPでは全てを_2つの下線の先頭のメソッドは、マジックメソッドの保存名として使用されます.クラスメソッドを定義するときは、2つの下線で始まるメソッド名を使用しないでください.
文書参照:https://www.php.net/manual/zh/language.oop5.magic.php
フルコード:https://github.com/zhangyue0503/php/blob/master/newblog/PHPMagic.php
公衆番号に注目:【ハードコアプロジェクトマネージャ】最新の文章を取得
追加微信/QQ朋友:【xiaoyuezigonggong/149844827】無料PHP、プロジェクト管理学習資料
知乎、公众号、震音、头条搜索【硬核プロジェクトマネージャー】
B局ID:482780532