ホームページ >バックエンド開発 >PHPチュートリアル >PHP のマジック定数 (変数)、マジック メソッド (関数)、およびスーパーグローバル変数の概要
この記事では主にPHPのマジック定数(変数)、マジックメソッド(関数)、スーパーグローバル変数の紹介をしています。ある参考値がありますので、共有します。困っている友達は参考にしてください
1. マジック定数 (マジック変数)
概念: いわゆるマジック定数は、PHP によって事前に定義されている定数です。場所により異なります。
1. __LINE__ ファイル内の現在の行番号を取得します。
2. __FILE__ ファイルの完全なパスとファイル名を取得します。
3. __DIR__ ファイルが存在するディレクトリを取得します。
4. __FUNCTION__ 関数名を取得します (PHP 4.3.0 で新しく追加されました)。
5. __CLASS__ クラスの名前を取得します (PHP 4.3.0 で新しく追加されました)。
6. __METHOD__ クラスのメソッド名を取得します (PHP 5.0.0 で新しく追加されました)。
7. __NAMESPACE__ 現在のネームスペースの名前 (大文字と小文字が区別されます)。
8. __TRAIT__ Trait の名前 (PHP 5.4.0 で新しく追加されました)。 PHP 5.4 以降、この定数は定義されたとおりの特性の名前を返します (大文字と小文字が区別されます)。トレイト名には、それが宣言されているスコープが含まれます (例: Foo\Bar)。
#2. スーパーグローバル変数 (9)
1, $GLOBALS: 変数をグローバル スコープに格納します。
2, $_SERVER : サーバー関連を取得します。情報
3, $_REQUEST: POSTおよびGETリクエストのパラメータを取得します##4, $_POST: フォームのPOSTリクエストパラメータを取得します##5, $_GET: フォームのGETリクエストパラメータを取得します
6. $_FILES: アップロードされたファイルの変数を取得します
7. $_ENV: サーバー側の環境変数の配列を取得します
8. $_COOKIE: ブラウザーの cookie を取得します
Set cookie:setcookie(name, value, Expire, path, domain);
Get cookie:$_COOKIE["user"];
Cookie の削除: setcookie(“user”, “”, time()-3600);//有効期限の設定
##9, $_SESSION: セッションの取得
サーバー側のセッション操作
session を使用する前に必ず session_start() を開始してください セッションの保存: $_SESSION['name']=”leixuesong”;//配列操作
セッションの破棄: unset($_SESSION['views']);//1 つ破棄
session_destroy() と unset($_SESSION);//すべてのセッションを破棄します
##3. マジック メソッド (マジック関数)##コンセプト: PHP では、__ (アンダースコア 2 つ) で終わるすべての項目が次のようになります。魔法のメソッドとして予約されています。したがって、上記のマジック メソッドを除き、クラス メソッドを定義する場合は、先頭に __ を付けないことをお勧めします。 は、__construct()、__destruct()、__call()、__callStatic()、__get()、__set()、__isset()、__unset ( )、__sleep()、__wakeup()、__toString()、__invoke()、__set_state()、__clone()、__debugInfo() は、PHP では「Magic メソッド」と呼ばれます。マジック機能を使用しない限り、独自のクラス メソッドに名前を付けるときにこれらのメソッド名を使用することはできません。 1. __construct() コンストラクター: このメソッドは、新しいオブジェクト (インスタンス化されたオブジェクト) が作成されるたびに最初に呼び出されるため、前に実行するのに非常に適しています。オブジェクトを使用して、いくつかの初期化作業が行われます。 アプリケーションノート: コンストラクターがサブクラスで定義されている場合、その親クラスのコンストラクターは暗黙的に呼び出されません。親クラスのコンストラクターを実行するには、サブクラスのコンストラクターで parent::__construct() を呼び出す必要があります。サブクラスでコンストラクターが定義されていない場合、通常のクラス メソッドと同様に親クラスから継承されます (プライベートとして定義されていない場合)。 アプリケーション例: <?php
class BaseClass {
function __construct() {
print "In BaseClass constructor\n";
}
}class SubClass extends BaseClass {
function __construct() {
parent::__construct();
print "In SubClass constructor\n";
}
}class OtherSubClass extends BaseClass { // inherits BaseClass's constructor}// In BaseClass constructor$obj = new BaseClass();// In BaseClass constructor
// In SubClass constructor$obj = new SubClass();// In BaseClass constructor$obj = new OtherSubClass();
?>
2. __destruct() デストラクター: デストラクターは、次の場合にすべての参照が削除または実行されます。オブジェクトは明示的に破棄されます。
#コンストラクターと同様、親クラスのデストラクターはエンジンによって秘密裏に呼び出されません。親クラスのデストラクターを実行するには、子クラスのデストラクター本体でparent::__destruct() を明示的に呼び出す必要があります。さらに、コンストラクターと同様に、サブクラスは、デストラクターが定義されていない場合、親クラスを継承します。
デストラクターは、exit() を使用してスクリプトの実行が終了した場合でも呼び出されます。デストラクターで exit() を呼び出すと、残りのシャットダウン操作が中止されます。
アプリケーション ノート:
1. スクリプトが閉じられると、デストラクターが呼び出されます。 , この時点で、すべてのHTTPヘッダーが送信されました。スクリプトを閉じたときの作業ディレクトリは、SAPI (Apache など) 内にあるときとは異なる可能性があります。
2. デストラクター (スクリプトの終了時に呼び出される) で例外をスローしようとすると、致命的なエラーが発生します。
アプリケーション例:
<?phpclass A { function __construct() { $a = func_get_args(); $i = func_num_args(); if (method_exists($this,$f='__construct'.$i)) { call_user_func_array(array($this,$f),$a); } } function __construct1($a1) { echo('__construct with 1 param called: '.$a1.PHP_EOL); } function __construct2($a1,$a2) { echo('__construct with 2 params called: '.$a1.','.$a2.PHP_EOL); } function __construct3($a1,$a2,$a3) { echo('__construct with 3 params called: '.$a1.','.$a2.','.$a3.PHP_EOL); } }$o = new A('sheep'); $o = new A('sheep','cat'); $o = new A('sheep','cat','dog');// results: // __construct with 1 param called: sheep // __construct with 2 params called: sheep,cat // __construct with 3 params called: sheep,cat,dog ?>3,
__call(): オブジェクト内でアクセスできないメソッドが呼び出された場合、__call() が呼び出されます。
public mixed __call ( string $name ,
array $arguments )
<?phpclass MethodTest { public function __call($name, $arguments) { // 注意: $name 的值区分大小写 echo "Calling object method '$name' " . implode(', ', $arguments). "\n"; } /** PHP 5.3.0之后版本 */ public static function __callStatic($name, $arguments) { // 注意: $name 的值区分大小写 echo "Calling static method '$name' " . implode(', ', $arguments). "\n"; } }$obj = new MethodTest;$obj->runTest('in object context'); MethodTest::runTest('in static context'); // PHP 5.3.0之后版本 ?>
4, __callStatic(): __callStatic() は、アクセスできないメソッドが静的コンテキストで呼び出されたときに呼び出されます。
5, __set(): 代入時に与えるアクセスできないプロパティに値を設定すると、__set() が呼び出されます。
6、__get(): いつ読み取られますかプロパティの値にアクセスできない場合は、__get() が呼び出されます。
7、__isset() : 当对不可访问属性调用 isset() 或 empty() 时,__isset() 会被调用。
8、__unset() : 当对不可访问属性调用 unset() 时,__unset() 会被调用。
9、__sleep() :方法常用于提交未提交的数据,或类似的清理操作。同时,如果有一些很大的对象,但不需要全部保存,这个功能就很好用。
serialize() 函数会检查类中是否存在一个魔术方法 __sleep()。如果存在,该方法会先被调用,然后才执行序列化操作。此功能可以用于清理对象,并返回一个包含对象中所有应被序列化的变量名称的数组。如果该方法未返回任何内容,则 NULL
被序列化,并产生一个 E_NOTICE
级别的错误。与之相反,unserialize() 会检查是否存在一个 __wakeup() 方法。如果存在,则会先调用 __wakeup 方法,预先准备对象需要的资源。
10、__wakeup() :经常用在反序列化操作中,例如重新建立数据库连接,或执行其它初始化操作。
应用范例:
<?php class Connection { protected $link; private $server, $username, $password, $db; public function __construct($server, $username, $password, $db) { $this->server = $server; $this->username = $username; $this->password = $password; $this->db = $db; $this->connect(); } private function connect() { $this->link = mysql_connect($this->server, $this->username, $this->password); mysql_select_db($this->db, $this->link); } public function __sleep() { return array('server', 'username', 'password', 'db'); } public function __wakeup() { $this->connect(); } } ?>
11、__toString() :__toString() 方法用于一个类被当成字符串时回应。例如 echo $obj; 应该显示些什么。此方法必须返回一个字符串,否则将发出一条 E_RECOVERABLE_ERROR
级别的致命错误。
<?php// Declare a simple classclass TestClass { public $foo; public function __construct($foo) { $this->foo = $foo; } public function __toString() { return $this->foo; } }$class = new TestClass('Hello');echo $class; //输出 Hello ?>
11、__invoke() :当尝试以调用函数的方式调用一个对象时,__invoke() 方法会被自动调用。(本特性只在 PHP 5.3.0 及以上版本有效)
<?phpclass CallableClass { function __invoke($x) { var_dump($x); } } $obj = new CallableClass;$obj(5); var_dump(is_callable($obj)); // is_callable — 检测参数是否为合法的可调用结构
?>以上会输出: int(5) bool(true)
12、__set_state() :自 PHP 5.1.0 起当调用 var_export() 导出类时,此静态 方法会被调用。本方法的唯一参数是一个数组,其中包含按 array('property' => value, ...) 格式排列的类属性。
应用范例:
<?phpclass A { public $var1; public $var2; public static function __set_state($an_array) // As of PHP 5.1.0 { $obj = new A; $obj->var1 = $an_array['var1']; $obj->var2 = $an_array['var2']; return $obj; } }$a = new A; $a->var1 = 5;$a->var2 = 'foo'; eval('$b = ' . var_export($a, true) . ';'); // $b = A::__set_state(array( // 'var1' => 5, // 'var2' => 'foo', // ));var_dump($b); ?>以上例程会输出:object(A)#2 (2) { ["var1"]=> int(5) ["var2"]=> string(3) "foo"}
13、__clone():对象复制。当复制完成时,如果定义了 __clone() 方法,则新创建的对象(复制生成的对象)中的 __clone() 方法会被调用,可用于修改属性的值(如果有必要的话)
应用范例:
<?php class SubObject { static $instances = 0; public $instance; public function __construct() { $this->instance = ++self::$instances; } public function __clone() { $this->instance = ++self::$instances; } }class MyCloneable { public $object1; public $object2; function __clone() { // 强制复制一份this->object, 否则仍然指向同一个对象 $this->object1 = clone $this->object1; } }$obj = new MyCloneable(); $obj->object1 = new SubObject(); $obj->object2 = new SubObject(); $obj2 = clone $obj; print("Original Object:\n"); print_r($obj); print("Cloned Object:\n"); print_r($obj2); ?> 以上例程会输出: Original Object:MyCloneable Object( [object1] => SubObject Object ( [instance] => 1 ) [object2] => SubObject Object ( [instance] => 2 ) ) Cloned Object:MyCloneable Object( [object1] => SubObject Object ( [instance] => 3 ) [object2] => SubObject Object ( [instance] => 2 ) )
以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!
相关推荐:
以上がPHP のマジック定数 (変数)、マジック メソッド (関数)、およびスーパーグローバル変数の概要の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。