ホームページ >バックエンド開発 >PHPチュートリアル >PHP マジック関数 __call() の使用法_PHP チュートリアル

PHP マジック関数 __call() の使用法_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-13 17:13:03846ブラウズ

PHP のいわゆるマジック関数は、簡単に言うと、PHP で特定の名前を持つメソッドです。すべて 2 つのアンダースコアで始まり、特定の時間に達すると、PHP インタープリターが自動的にそのメソッドを見つけて実行します。最も一般的なマジック関数は、もちろんコンストラクター メソッド __construct です。

PHP でのメソッド呼び出しは次のように動作します。まず、PHP インタープリターはクラスのメソッドを検索します。メソッドが存在する場合、PHP はそれを呼び出します。そうでない場合は、クラスのマジック関数 __call が呼び出されます (このメソッドが存在する場合)。 __call が失敗した場合は、親クラスのメソッドが呼び出されます。

赤い唇と白い歯でこれを言うのは少し変態的すぎるように思えます。次のコードを見てみましょう:

コードは次のとおりです コードをコピー

クラステスト{
パブリック関数 __construct(){
echo "これは構築です!n";
}
}

このテストクラスのテストには、不要な文字を出力するコンストラクターが 1 つだけあり、他には何もありません。

この時点で、インスタンス化して * メソッドを呼び出します。これは何を行うと思いますか?私たちはすぐにそれを実行し、観察しました:

コードは次のとおりですコードをコピー
$send = 新しいテスト();

$send->atomBomb();

その結果は考えられますが、彼は間違いなく、そのような方法はないと言うでしょう - 私たちは実際にそのような方法を持っていません*!エラーメッセージは次のとおりです:

デバッグ エラー: test.php 行 9 – 未定義メソッド test::atomBomb() の呼び出し

次に、このクラスを変更して __call メソッドを追加し、何が起こるか見てみましょう:

コードは次のとおりですコードをコピー
……

クラステスト{
パブリック関数 __construct(){
echo "これは構築です!n";
}

パブリック関数 __call($name,$arg){

echo “関数名:”,$name,”n arg:”.$arg;
}
}

上記の呼び出しメソッドを繰り返します:

$send = 新しいテスト();
$send->atomBomb('ab',9);

今回見た結果は前回とは明らかに違いました。結果は以下の通りです:

これはコンストラクターです! //これはコンストラクター自体によって出力されます

//以下は__call関数による出力です

コードは次のとおりですコードをコピー関数名:atomBomb

そして、__call には 2 つのパラメーターがあることが簡単にわかります。最初のパラメーター: 呼び出されるメソッドの名前、2 番目のパラメーター: メソッドを呼び出すときに入力されるパラメーター (ここは配列です)。

私の言ったことを理解できるかどうかはわかりませんが、もし理解できたら、これは何の役に立つのかと必ず尋ねると思います。何に使えますか?

それでは、その使用方法についてのアイデアをご紹介します。学んだことを応用してください。想像してみてください。データベース内のすべてのテーブルをオブジェクトとして扱い、それらに対して CURD 操作を実行する場合、いくつのクラスを作成する必要があるでしょうか?もちろん、配列ライブラリにテーブルが 2 つしかない場合は、クラスが 2 つしかないことがわかります。しかし、108 個のテーブルがあり (たとえば、dede に 108 個のテーブルがある)、108 個のクラスを手動で入力する必要がある場合はどうなるでしょうか?明らかに非科学的ですが、21 世紀で最も高価なものは何ですか? - 時間!

クラスは間違いなく作成でき、残りは自動的に作成されます。これは上級エンジニアが書いたものです。

引数:配列
コードは次のとおりです コードをコピー
クラス DBObject{
プライベート $id = 0;
プライベート $テーブル;
private $fields = array();
function __construct( $table, $fields ) {
$this->table = $table;
foreach( $fields as $key )
$this->fields[ $key ] = null;
}
function __call( $method, $args ) {
if ( preg_match( "/set_(.*)/", $method, $found ) ) {
if ( array_key_exists( $found[1], $this->fields ) ) {
$this->fields[ $found[1] ] = $args[0];
true を返します;
}
}
else if ( preg_match( "/get_(.*)/", $method, $found ) ) {
if ( array_key_exists( $found[1], $this->fields ) ) {
return $this->fields[ $found[1] ];
}
}
false を返します;
}
関数 insert() {
グローバル $db;
$fields = $this->table."_id, ";
$fields .= join( ", ", array_keys( $this->fields ) );
$inspoints = array( "0" );
foreach( array_keys( $this->fields ) as $field )
$inspoints []= "?";
$inspt = join( ", ", $inspoints );
$sql = "INSERT INTO ".$this->table." ( $fields ) VALUES ( $inspt )";
$values = array();
foreach( array_keys( $this->fields ) as $field )
$values []= $this->fields[ $field ];
$sth = $db->prepare( $sql );
$db->e​​xecute( $sth, $values );
$res = $db->query( "SELECT last_insert_id()" );
$res->fetchInto( $row );
$this->id = $row[0];
$row[0] を返します;
}

//以下の 3 つの削除方法は、更新、1 つ削除、すべて削除です (戦場のメモ)
}
$book = new DBObject( '本', array( '著者',
'タイトル'、'発行者' ) );
$book->delete_all();
$book->set_title( "PHP ハック" );
$book->set_author( "ジャック ヘリントン" );
$book->set_publisher( "オライリー" );
$id = $book->insert();
echo ( "新しい書籍 ID = $idn" );
$book->set_title( "ポッドキャスティングのハック" );
$book->update();
$book2 = new DBObject( '本', array( '著者',
'タイトル'、'発行者' ) );
$book2->load( $id );
echo( "Title = ".$book2->get_title()."n" );
$book2->delete( );……

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/629239.html技術記事 PHP のいわゆるマジック関数は、PHP では単に特定の名前を持っています。それらはすべて 2 つのアンダースコアで始まり、特定の時間に実行されると、PHP インタープリターが自動的にそれらを検索します...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。