PHP のマジック関数とマジック定数
1.オブジェクトのインスタンス化時に __construct()
が呼び出されます。 __construct とクラス名と関数名の関数が同時に存在する場合、__construct が呼び出され、もう一方は呼び出されません。
2. __destruct()
オブジェクトが削除されるか、オブジェクトの操作が終了するときに呼び出されます。
3. __call()
オブジェクトはメソッドを呼び出します。メソッドが存在する場合は直接呼び出され、存在しない場合は __call 関数が呼び出されます。
4. __get()
オブジェクトの属性を読み取る場合、属性が存在する場合は属性値が直接返され、存在しない場合は __get 関数が呼び出されます。
5. __set()
オブジェクトの属性を設定する場合、属性が存在する場合は値が直接割り当てられ、存在しない場合は __set 関数が呼び出されます。
6. __toString()
は、オブジェクトを印刷するときに呼び出されます。 echo $obj; または print $obj;
7 など。 __clone()
オブジェクトのクローンを作成するときに呼び出されます。例: $t=new Test();$t1=clone $t;
8. __sleep()
はシリアル化の前に呼び出されます。オブジェクトが比較的大きく、シリアル化する前に少し削除したい場合は、この関数を検討できます。
9. __wakeup()
は、シリアル化解除時に呼び出され、オブジェクトの初期化作業を実行します。
10. __isset()
は、オブジェクトの属性が存在するかどうかを確認するときに呼び出されます。例: isset($c->name)。
11. __unset()
オブジェクトのプロパティの設定を解除するときに呼び出されます。例: unset($c->name)。
12. __set_state()
は、var_export が呼び出されたときに呼び出されます。 __set_state の戻り値を var_export の戻り値として使用します。
13. __autoload()
オブジェクトをインスタンス化する際、対応するクラスが存在しない場合、このメソッドが呼び出されます。
[魔法定数]
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 で新しく追加されました)。定義されたとおりのメソッド名を返します (大文字と小文字が区別されます)。
(1) マジック メソッドの最初の紹介
Php5.0 は、リリース以来、多くのオブジェクト指向機能を提供してきました。特に、コーディングを簡素化し、より適切な設計を可能にする多くの使いやすいマジック メソッドを提供してきました。システム。今日はphp5.0が提供するマジックメソッドについて学びます。
1, __construct() オブジェクトをインスタンス化するとき、最初にオブジェクトのこのメソッドが呼び出されます。
class Test
{
function __construct(){
echo "before";
}
}
$t = new Test();
出力は次のとおりです:
start
class Test
{
function Test(){
echo "end2";
}
function __construct(){
echo "end";
}
}
$t = new Test();
//output end
?>
同じクラス名の php5 オブジェクト モデルと関数がクラスのコンストラクターであることがわかっているため、コンストラクターと __construct() メソッドを同時に定義すると、php5 は関数を呼び出す代わりにデフォルトでコンストラクターを呼び出します。同じ名前なので、__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() が出力されます。値に達すると、exist が呼び出されます。
クラス Test
{
パブリック関数 __set($key,$value){
echo 'pair'.$key . "value".$value;
}
}
$t = new Test();
$t->name = "aninggo";
は出力します:
名前 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 "Print 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;
プログラム出力:
クローンが作成されました!
__sleep と __wakeup
Serialize は、オブジェクトを含む変数を連続バイト データに変換し、それらをファイルに保存したり、それらを元のデータに逆シリアル化したりできます。クラスのオブジェクトを逆シリアル化する前に定義すると、PHP はそのオブジェクトのプロパティとメソッドを正常に保存できます。このために、PHP は自動的に __sleep と __wakeup を検索します。
オブジェクトがシリアル化されると、PHP は __sleep メソッドを呼び出します (存在する場合)。オブジェクトを逆シリアル化した後、PHP は _ _wakeup メソッドを呼び出します。どちらのメソッドも属性を含む配列を返す必要はありません。 __sleep メソッドがない場合、PHP は他の属性の値を破棄します。
例 6.16 は、__sleep メソッドと __wakeup メソッドを使用してオブジェクトをシリアル化する方法を示しています。 Id 属性は、オブジェクト内に保持されることを意図していない一時的な属性です。逆にされた場合、__wakeup メソッドは、シリアル化されたオブジェクトに id 属性が含まれないことを保証します。この例は、自立するように設計されています。実際の開発では、リソース (画像やデータ ストリームなど) を含むオブジェクトに次のメソッドが必要になる場合があります。
オブジェクトのシリアル化
CODE: [コピー先]クリップボード]
------------------------------------------- --- --------
クラス ユーザー
{
public $name;
public $id;
function __construct() {
/ /ユーザーに一意の ID を与える 別の ID を与える
$this->id = uniqid();
}
function __sleep() {
//this をシリアル化しない -> ;id id をシリアル化しない
return(array("name"));
}
function __wakeup() {
//ユーザーに一意の ID を与える
$this->id = uniqid();
}
//オブジェクトを作成します
$u = 新しいユーザー
$u->name = "Leon";
/ / シリアル化します。id 属性がシリアル化されていないことに注意してください。id の値は破棄されます
$s = Serialize($u);
//シリアル化を解除し、逆シリアル化 ID が再割り当てされます
$u2 = unserialize($s);
//$u と $u2 は異なる ID を持ちます $u と $u2 は異なる ID を持ちます
print_r($u);
print_r($u2); >
__set_state と __invoke
テスト コードは次のとおりです。
class A {
public static function __set_state($args)
{
$ obj= new A();
foreach($args as $k=>$v){
$obj->$k = $v;
}
return $obj;
}
}
$a = 新しい A;
$a->名前 = 'cluries';
$a->性別 = '女性';
eval( '$b = ' . var_export($a, true).';');
print_r($b);
?>
プログラム出力
object(A)#2 (2){__SET_STATEの関数はオブジェクトをコピーすることであり、__SET_STATEで定義して、オブジェクトをコピーするときにコピーされたオブジェクトに変更を加えることができます。 __clone との違いは、__set_state がパラメータを受け入れることができ、__set_state の方が強力に使用できることです。個人的には、これはあまり役に立たないと思います = =!
次に、__invoke について話しましょう。
マニュアルの非常に特別なステートメント 顕著: 注: この機能は PHP 5.3.0 以降で利用可能です。
スクリプトがオブジェクトを関数として呼び出そうとすると、__invoke メソッドが呼び出されます。 使用時に呼び出されますか?少し奇妙ですが、この関数は何に使うのでしょうか?
次に、提供されている例を見てみましょう:
class CallableClass {
function __invoke($x){
var_dump($x);
}
}
$obj=new CallableClass;
$obj(5);
var_dump(is_callable($obj));
?>
プログラム出力:
int( 5)
bool(true)
実際にはオブジェクトを関数として使用します...
__autoload
PHP5 には __autoload() というメソッドがあります。これは単に自動ロードです。クラスの数;
PHP が編成していないクラスを使用しようとすると、グローバル関数 __autoload が検索され、この関数が存在する場合、PHP はクラスの名前であるパラメーターを使用してそれを呼び出します。
次に、単純にテストします。
まず、「Test_autoload.php」という名前のファイルを作成します。
< php
/**
* __autoload メソッドをテストします
*
*/
class Test_autoload {
public function __construct ( ) {
echo " Test_autoload. " ;
}
}
?>
クラス名に注意し、ファイルを作成して __autoload() メソッドをオーバーライドします。 " test.php";
< php
/**
* __autoload メソッドをオーバーライドします
*/
function __autoload ( $class ) {
include $class ' ;
$test = new Test_autoload () ;
unset ( $test ) ;
?>
最終結果は次のとおりです。
------ -- ----------------------------------
8.ところで、php5
(1) で提供されている非常にCOOlな実験的な関数をいくつか紹介します。 runkit_method_rename
この関数は、呼び出す関数の名前を動的に変更できます。
class Test
{
function foo() {
'foo',//実際に呼び出される関数
'bar'// 呼び出される関数を表示する
) ;
echo Test::bar();
プログラムは出力します
FOO! (2) runkit_method_add
この関数は関数を動的に追加できます
class test
{
Function Foo () {
Return "Foo!";
}
}
runkit_method_add(
Test, //クラス名
'add', //新しい関数名
'$num1, $num2',//パラメータを渡す
'return $num1 + $num2;',//実行されたコード
RUNKIT_ACC_PUBLIC
);
//echo $e->add(12, 4);
(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テストを簡単に実装できます。クールですね?
class Example {
function foo() {
return "foo! ";
}
}
//テストオブジェクトを作成します
$ e = new Example();
//
echo "Before: " を出力します。 $e->foo();
// 戻り値を変更します
runkit_method_redefine(
'Example ',
'foo',
'',
'return "bar! ";',
RUNKIT_ACC_PUBLIC
);
//実行出力
echo " 後: " . $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')); >プログラム出力
バー
1階
バルド
2011-04-18
3. __call()
オブジェクトはメソッドを呼び出します。メソッドが存在する場合は、そのメソッドが直接呼び出されます。メソッドが存在しない場合は、__call 関数が呼び出されます。
4. __get()
オブジェクトの属性を読み取る場合、その属性が存在する場合はその属性値が直接返され、存在しない場合は __get 関数が呼び出されます。
5. __set()
オブジェクトの属性を設定する場合、属性が存在する場合は値が直接割り当てられ、存在しない場合は __set 関数が呼び出されます。
2階 バルド 2011-04-18
6. __toString()
オブジェクトを印刷するときに呼び出されます。 echo $obj; や print $obj;
strval($obj) なども呼び出しをトリガーします。
が呼び出されます。 __construct とクラス名と関数名の関数が同時に存在する場合、__construct が呼び出され、もう一方は呼び出されません。
7. __clone()
オブジェクトのクローンを作成するときに呼び出されます。例: $t=new Test();$t1=clone $t;13. __autoload()
オブジェクトをインスタンス化する際、対応するクラスが存在しない場合、このメソッドが呼び出されます。
これら 3 つはオペレーター トリガーです。
1 つは新しいオペレーターです。 1 つはクローン オペレーターです。
4階 バルド 2011-04-18
は、シリアル化解除時に呼び出され、オブジェクトの初期化作業を実行します。
。 __sleep()
削除に限定されません。 __call 関数を使用するクラスの場合、__sleep() を使用しないとシリアル化を完了できません。