ホームページ >バックエンド開発 >PHPチュートリアル >PHP_007 マジック変数とマジック関数
マジック変数
PHP は、実行するスクリプトに多数の事前定義された定数を提供します。
ただし、多くの定数はさまざまな拡張ライブラリによって定義されており、これらの拡張ライブラリがロードされたとき、動的ロード後、またはコンパイル中に組み込まれた場合にのみ表示されます。
コード内の位置に応じて値が変化する魔法の定数が 8 つあります。
たとえば、__LINE__ の値は、スクリプト内のどの行にあるかによって異なります。これらの特別な定数は大文字と小文字が区別されず、次のとおりです:
ファイル内の現在の行番号。
例:
<?phpecho '这是第 “ ' . __LINE__ . ' ” 行';?>
上記の例の出力結果は次のとおりです:
这是第 “ 2 ” 行
ファイルのフルパスとファイル名。インクルードされたファイル内で使用された場合、インクルードされたファイルの名前を返します。
PHP 4.0.2 以降、__FILE__ には常に絶対パス (シンボリック リンクの場合は解決された絶対パス) が含まれますが、以前のバージョンには相対パスが含まれる場合がありました。
例:
<?phpecho '该文件位于 “ ' . __FILE__ . ' ” ';?>
上記の例の出力結果は次のとおりです:
该文件位于 “ E:\wamp\www\test\index.php ”
ファイルが配置されているディレクトリ。インクルードされたファイル内で使用された場合、インクルードされたファイルが配置されているディレクトリを返します。
dirname(__FILE__) と同等です。ルート ディレクトリでない限り、ディレクトリ名には末尾のスラッシュは含まれません。 (PHP 5.3.0 の新機能)
例:
<?phpecho '该文件位于 “ ' . __DIR__ . ' ” ';?>
上記の例の出力結果は次のとおりです:
该文件位于 “ E:\wamp\www\test ”
関数名 (PHP 4.3.0 で新規追加)。 PHP 5 以降、この定数は定義されたとおりの関数名を返します (大文字と小文字は区別されます)。 PHP 4 では、この値は常に小文字です。
例:
<?phpfunction test() { echo '函数名为:' . __FUNCTION__ ;}test();?>
上記の例の出力結果は次のとおりです:
函数名为:test
クラスの名前 (PHP 4.3.0 で新しく追加されました)。 PHP 5 以降、この定数は定義されたときのクラスの名前を返します (大文字と小文字は区別されます)。
PHP 4 では、値は常に小文字です。クラス名には、それが宣言されているスコープが含まれます (例: FooBar)。 PHP 5.4 以降、__CLASS__ はトレイトに対しても機能することに注意してください。特性メソッド内で使用される場合、__CLASS__ は特性メソッドを呼び出すクラスの名前になります。
例:
<?php<?phpclass test { function _print() { echo '类名为:' . __CLASS__ . "<br>"; echo '函数名为:' . __FUNCTION__ ; }}$t = new test();$t->_print();?>
上記の例の出力結果は次のとおりです:
类名为:test函数名为:_print
トレイト名 (PHP 5.4.0 で新規追加)。 PHP 5.4.0 以降、PHP はトレイトと呼ばれるコード再利用の方法を実装しています。
トレイト名には、それが宣言されるスコープが含まれます (例: FooBar)。
基本クラスから継承されたメンバーは、挿入された SayWorld トレイトの MyHelloWorld メソッドによってオーバーライドされます。その動作は、MyHelloWorld クラスで定義されたメソッドと一致しています。優先順位としては、現在のクラスのメソッドが特性メソッドをオーバーライドし、特性メソッドが基本クラスのメソッドをオーバーライドします。
<?phpclass Base { public function sayHello() { echo 'Hello '; }} { public function sayHello() { parent::sayHello(); echo 'World!'; }}class MyHelloWorld extends Base { }$o = new MyHelloWorld();$o->sayHello();?>
上記のルーチンは次を出力します:
Hello World!
クラスのメソッド名 (PHP 5.0.0 で新しく追加されました)。定義されたとおりのメソッド名を返します (大文字と小文字が区別されます)。
例:
<?phpfunction test() { echo '函数名为:' . __METHOD__ ;}test();?>
上記の例の出力結果は次のとおりです:
函数名为:test
現在の名前空間の名前 (大文字と小文字が区別されます)。この定数はコンパイル時に定義されます (PHP 5.3.0 の新機能)。
例:
<?phpnamespace MyProject;echo '命名空间为:"', __NAMESPACE__, '"'; // 输出 "MyProject"?>
上記の例の出力結果は次のとおりです:
命名空间为:"MyProject"マジック関数
__construct()
はオブジェクトのインスタンス化時に呼び出され、
__construct とそのクラス名と関数名の関数が存在する場合同時に、 __construct will が呼び出されますが、もう一方は呼び出されません。
__destruct()
オブジェクトが削除されるか、オブジェクトの操作が終了するときに呼び出されます。
__call()
オブジェクトはメソッドを呼び出します。
メソッドが存在する場合は、直接呼び出されます。
存在しない場合は、__call 関数が呼び出されます。
__get()
オブジェクトの属性を読み取る場合、
属性が存在する場合は属性値が直接返されます
存在しない場合は __get 関数が呼び出されます。
__set()
オブジェクトの属性を設定する場合、
属性が存在する場合は値が直接割り当てられます
存在しない場合は __set 関数が呼び出されます。
__toString()
オブジェクトを印刷するときに呼び出されます。 echo $obj; や print $obj;
__clone()
は、オブジェクトの複製時に呼び出されます。例: $t=new Test();$t1=clone $t;
__sleep()
serialize が前に呼び出されます。オブジェクトが比較的大きく、シリアル化する前にいくつかのものを削除したい場合は、この関数を検討できます。
__wakeup()
は、オブジェクトの初期化作業を行うためにアンシリアル化するときに呼び出されます。
__isset()
オブジェクトの属性が存在するかどうかを検出するときに呼び出されます。例: isset($c->name)。
__unset()
は、オブジェクトのプロパティの設定を解除するときに呼び出されます。例: unset($c->name)。
__set_state()
var_export が呼び出されたときに呼び出されます。 __set_state の戻り値を var_export の戻り値として使用します。
__autoload()
オブジェクトをインスタンス化する際、対応するクラスが存在しない場合、このメソッドが呼び出されます。