https://www.cnblogs.com/ccw869476711/p/9183783.html
一、魔術常量(魔術變量)
概念:所謂的魔術常量就是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 起此常量返回 trait 被定義時的名字(區分大小寫)。Trait 名包括其被聲明的作用區域(例如 Foo\Bar)。
二、超全局變量(9個)
1、$GLOBALS :儲存全局作用域中的變量
2、$_SERVER :獲取服務器相關信息
3、$_REQUEST :獲取POST和GET請求的參數
4、$_POST : 獲取表單的POST請求參數
5、$_GET: 獲取表單的GET請求參數
6、$_FILES :獲取上傳文件的的變量
7、$_ENV : 獲取服務器端環境變量的數組
8、$_COOKIE:獲取瀏覽器的cookie
瀏覽器cookie的操作
設置cookie:setcookie(name, value, expire, path, domain);
獲取cookie:$_COOKIE[“user”];
刪除cookie:setcookie(“user”, “”, time()-3600);//設置過期時間
9、$_SESSION : 獲取session
服務端session的操作
使用session前一定要session_start()啟動session
儲存session:$_SESSION[‘name’]=”leixuesong”;//數組操作
銷毀session:unset($_SESSION[‘views’]);//銷毀一個
session_destroy()和unset($_SESSION);//銷毀所有的session
三、魔術方法(魔術函數)
概念:PHP 將所有以 __(兩個下划線)開頭的類方法保留為魔術方法。所以在定義類方法時,除了上述魔術方法,建議不要以 __ 為前綴。
分別為: __construct(), __destruct(), __call(), __callStatic(), __get(), __set(), __isset(), __unset(), __sleep(), __wakeup(), __toString(), __invoke(), __set_state(), __clone() 和 __debugInfo() 等方法在 PHP 中被稱為"魔術方法"(Magic methods)。在命名自己的類方法時不能使用這些方法名,除非是想使用其魔術功能。
1、__construct() 構造函數:每次創建新對象(實例化對象)時先調用此方法,所以非常適合在使用對象之前做一些初始化工作。
應用筆記:如果子類中定義了構造函數則不會隱式調用其父類的構造函數。要執行父類的構造函數,需要在子類的構造函數中調用 parent::__construct()。如果子類沒有定義構造函數則會如同一個普通的類方法一樣從父類繼承(假如沒有被定義為 private 的話)。
應用范例:
<?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.試圖在析構函數(在腳本終止時被調用)中拋出一個異常會導致致命錯誤。
應用范例:
<?php
class 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
)
$name 參數是要調用的方法名稱。$arguments 參數是一個枚舉數組,包含着要傳遞給方法 $name 的參數。
<?php
class 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 class class 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 及以上版本有效)
<?php
class 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, ...) 格式排列的類屬性。
應用范例:
<?php
class 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 ) )