ホームページ >バックエンド開発 >PHPチュートリアル >PHP マジック関数 __call() の使用法_PHP チュートリアル
PHP のいわゆるマジック関数は、簡単に言うと、PHP で特定の名前を持つメソッドです。すべて 2 つのアンダースコアで始まり、特定の時間に達すると、PHP インタープリターが自動的にそのメソッドを見つけて実行します。最も一般的なマジック関数は、もちろんコンストラクター メソッド __construct です。
PHP でのメソッド呼び出しは次のように動作します。まず、PHP インタープリターはクラスのメソッドを検索します。メソッドが存在する場合、PHP はそれを呼び出します。そうでない場合は、クラスのマジック関数 __call が呼び出されます (このメソッドが存在する場合)。 __call が失敗した場合は、親クラスのメソッドが呼び出されます。
赤い唇と白い歯でこれを言うのは少し変態的すぎるように思えます。次のコードを見てみましょう:
コードは次のとおりです | コードをコピー |
クラステスト{ |
このテストクラスのテストには、不要な文字を出力するコンストラクターが 1 つだけあり、他には何もありません。
この時点で、インスタンス化して * メソッドを呼び出します。これは何を行うと思いますか?私たちはすぐにそれを実行し、観察しました:
コードをコピー | |
$send = 新しいテスト();
$send->atomBomb(); |
デバッグ エラー: test.php 行 9 – 未定義メソッド test::atomBomb() の呼び出し
コードをコピー | |
……
クラステスト{
echo “関数名:”,$name,”n arg:”.$arg;
$send = 新しいテスト(); |
これはコンストラクターです! //これはコンストラクター自体によって出力されます
//以下は__call関数による出力です
コードをコピー | |
引数:配列 |
コードは次のとおりです | コードをコピー |
クラス 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->execute( $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( );…… |