ホームページ  >  記事  >  バックエンド開発  >  PHPマジック関数の実行時間とシーケンス解析

PHPマジック関数の実行時間とシーケンス解析

WBOY
WBOYオリジナル
2016-06-13 13:11:34873ブラウズ

PHPマジック関数の実行時間とシーケンス解析

1: 魔法の関数

1. __construct()
はオブジェクトをインスタンス化するときに呼び出されます。
__construct とクラス名と関数名の関数が同時に存在する場合、__construct が呼び出され、もう一方は呼び出されません。
2. __destruct()
オブジェクトが削除されるか、オブジェクトの操作が終了するときに呼び出されます。
3. __call()
オブジェクトは特定のメソッドを呼び出します。
メソッドが存在する場合は直接呼び出されます。
存在しない場合は __call 関数が呼び出されます。
4. __get()
オブジェクトの属性を読み取る場合、
属性が存在する場合は属性値が直接返されます。
存在しない場合は __get 関数が呼び出されます。
5. __set()
オブジェクトの属性を設定するとき、
属性が存在する場合は値が直接割り当てられます。
存在しない場合は __set 関数が呼び出されます。
6. __toString()
オブジェクトを印刷または出力するときに呼び出されます。 echo $obj; または print $obj; など。 __clone()
オブジェクトのクローンを作成するときに呼び出されます。例: $t=new Test();$t1=clone $t; __sleep()
はシリアル化の前に呼び出されます。オブジェクトが比較的大きく、シリアル化する前にいくつかのものを削除したい場合は、この関数を検討できます。
9. __wakeup()
は、シリアル化解除時に呼び出され、オブジェクトの初期化作業を実行します。
10. __isset()
オブジェクトの属性が存在するかどうかを確認するときに呼び出されます。例: isset($c->name)。
11. __unset()
オブジェクトのプロパティの設定を解除するときに呼び出されます。例: unset($c->name)。
12. __set_state()
var_export が呼び出されたときに呼び出されます。 __set_state の戻り値を var_export の戻り値として使用します。
13. __autoload()
オブジェクトをインスタンス化する際、対応するクラスが存在しない場合、このメソッドが呼び出されます。

2: 魔法定数 1. __LINE__
ファイル内の現在の行番号を返します。
2. __FILE__
ファイルのフルパスとファイル名を返します。インクルード ファイルで使用された場合は、インクルード ファイル名を返します。 PHP 4.0.2 以降、__FILE__ には常に絶対パスが含まれますが、それより前のバージョンには相対パスが含まれる場合がありました。
3. __FUNCTION__
関数名を返します (PHP 4.3.0 の新機能)。 PHP 5 以降、この定数は定義されたとおりの関数名を返します (大文字と小文字は区別されます)。 PHP 4 では、この値は常に小文字です。
4. __CLASS__
クラスの名前を返します (PHP 4.3.0 の新機能)。 PHP 5 以降、この定数は定義されたときのクラスの名前を返します (大文字と小文字は区別されます)。 PHP 4 では、この値は常に小文字です。
5. __METHOD__
クラスのメソッド名を返します (PHP 5.0.0 で新しく追加されました)。定義されたとおりのメソッド名を返します (大文字と小文字が区別されます)。

3: マジック関数の例

1.__construct() オブジェクトをインスタンス化するとき、最初にオブジェクトのこのメソッドが呼び出されます。

class Test 
{ 
 function __construct() 
 { 
  echo "before"; 
 } 
} 
$t = new Test();
出力は次のとおりです: start

同じクラス名の php5 オブジェクト モデルと関数がクラスのコンストラクターであることがわかっているため、コンストラクターと __construct() メソッドを同時に定義すると、php5 __construct() 関数が呼び出される代わりに、デフォルトでコンストラクターが呼び出されます。そのため、__construct() はクラス
のデフォルトのコンストラクターとして機能します。

2.__destruct() このメソッドは、オブジェクトが削除されるか、オブジェクトの操作が終了するときに呼び出されます。

class Test 
{ 
 function __destruct() 
 { 
  echo "end"; 
 } 
} 
$t = new Test();
将会输出
end
オブジェクトの操作が完了したらリソースを解放するなどの操作を実行できます

3.__get() は、存在しないプロパティを読み取ろうとしたときに呼び出されます。

オブジェクトに存在しないプロパティを読み取ろうとすると、PHP はエラー メッセージを表示します。クラスに __get メソッドを追加すると、この関数を使用して Java のリフレクションと同様のさまざまな操作を実装できます。

class Test 
{ 
 public function __get($key) 
 { 
  echo $key . " 不存在"; 
 } 
} 

$t = new Test(); 
echo $t->name; 

就会输出:
name 不存在

4.__set() は、存在しないプロパティに値を書き込もうとするときに呼び出されます。

class Test 
{ 
 public function __set($key,$value) 
 { 
  echo '对'.$key . "附值".$value; 
 } 
} 


$t = new Test(); 
$t->name = "aninggo"; 

就会输出:
对 name 附值 aninggo

?

5.__call() このメソッドは、オブジェクトに存在しないメソッドを呼び出そうとしたときに呼び出されます。

class Test 
{ 
 public function __call($Key, $Args) 
 { 
  echo "您要调用的 {$Key} 方法不存在。你传入的参数是:" . print_r($Args, true); 
 } 
} 

$t = new Test(); 
$t->getName(aning,go);
プログラムは次のように出力します:

呼び出したい getName メソッドは存在しません。パラメータは次のとおりです: Array
(
[0] => aning
[1] => go
)

オブジェクト
を印刷するときに 6.__toString() が呼び出されます。

このメソッドは、Java の toString メソッドに似ています。この関数は、オブジェクトを直接出力するときに呼び出されます。

class Test 
{ 
 public function __toString() 
 { 
  return "打印 Test"; 
 } 
} 


$t = new Test(); 

echo $t; 
echo $t; が実行されると、$t->toString() が呼び出され、

print Test
が出力されます。

7.__clone() はオブジェクトのクローン作成時に呼び出されます

class Test 
{ 

 public function __clone() 
 { 
  echo "我被复制了!"; 
 } 
}

$t = new Test(); 
$t1 = clone $t;

程序输出:我被克隆了!

4.ところで、php5 で提供されている非常に COOl な実験関数をいくつか紹介します
(1) runkit_method_rename
この関数は呼び出す関数の名前を動的に変更できます。

class Test 
{ 

 function foo() {
        return "foo! ";
    }

} 

runkit_method_rename(
    'Test', //类名
    'foo',//实际调用的函数
    'bar'//显示调用的函数
);

echo Test::bar();

程序将输出
 
foo!
(2) runkit_method_add

この関数はクラスに関数を動的に追加できます

(3)runkit_method_copy
可以把A类中的函数拷贝到类B中并对函数重命名

class Foo {
    function example() {
        return "foo! ";
    }
}

class Bar {
    //空类
}

//执行拷贝
runkit_method_copy('Bar', 'baz', 'Foo', 'example');

//执行拷贝后的函数
echo Bar::baz();

(4) runkit_method_redefine
动态的修改函数的返回值
这个函数可以让我们轻松的实现对类的MOCK测试!是不是很COOL呢

class Example {
    function foo() {
        return "foo! ";
    }
}

//创建一个测试对象
$e = new Example();

// 在测试对象之前输出
echo "Before: " . $e->foo();

// 修改返回值
runkit_method_redefine(
    'Example',
    'foo',
    '',
    'return "bar! ";',
    RUNKIT_ACC_PUBLIC
);

// 执行输出
echo "After: " . $e->foo();

(5)runkit_method_remove
这个函数就很简单了,看名字就能看出来了,动态的从类中移除函数

class Test { function foo() { return "foo! "; } function bar() { return "bar! "; } } // 移除foo函数 runkit_method_remove( 'Test', 'foo' ); echo implode(' ', get_class_methods('Test')); 程序输出 bar

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