首頁  >  文章  >  後端開發  >  PHP的魔術常數(變數)、魔術方法(函數)、超全局變數的介紹

PHP的魔術常數(變數)、魔術方法(函數)、超全局變數的介紹

不言
不言原創
2018-07-05 11:29:372006瀏覽

這篇文章主要介紹了關於PHP的魔術常數(變數)、魔術方法(函數)、超全局變數的介紹,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下

一、魔術常數(魔術變數)

概念:所謂的魔術常數就是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&#39;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=&#39;__construct&#39;.$i)) {            
    call_user_func_array(array($this,$f),$a);
        }
    }   
    function __construct1($a1)
    {        
    echo(&#39;__construct with 1 param called: &#39;.$a1.PHP_EOL);
    }   
    function __construct2($a1,$a2)
    {        
    echo(&#39;__construct with 2 params called: &#39;.$a1.&#39;,&#39;.$a2.PHP_EOL);
    }   
    function __construct3($a1,$a2,$a3)
    {        
    echo(&#39;__construct with 3 params called: &#39;.$a1.&#39;,&#39;.$a2.&#39;,&#39;.$a3.PHP_EOL);
    }
}$o = new A(&#39;sheep&#39;);
$o = new A(&#39;sheep&#39;,&#39;cat&#39;);
$o = new A(&#39;sheep&#39;,&#39;cat&#39;,&#39;dog&#39;);// 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 &#39;$name&#39; "
             . implode(&#39;, &#39;, $arguments). "\n";
    }    /**  PHP 5.3.0之后版本  */    
    public static function __callStatic($name, $arguments) 
    {        // 注意: $name 的值区分大小写        
    echo "Calling static method &#39;$name&#39; "
             . implode(&#39;, &#39;, $arguments). "\n";
    }
}$obj = new MethodTest;$obj->runTest(&#39;in object context&#39;);

MethodTest::runTest(&#39;in static context&#39;);  // 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(&#39;server&#39;, &#39;username&#39;, &#39;password&#39;, &#39;db&#39;);
    }    
    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(&#39;Hello&#39;);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[&#39;var1&#39;];        
$obj->var2 = $an_array[&#39;var2&#39;];        
return $obj;
    }
}$a = new A;
$a->var1 = 5;$a->var2 = &#39;foo&#39;;
eval(&#39;$b = &#39; . var_export($a, true) . &#39;;&#39;); // $b = A::__set_state(array(
                                            //    &#39;var1&#39; => 5,
                                            //    &#39;var2&#39; => &#39;foo&#39;,
                                            // ));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中static、final、interface、abstract的区别

PHP empty()函数的说明

PHP测试memcached 的方法

以上是PHP的魔術常數(變數)、魔術方法(函數)、超全局變數的介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn