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

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

Jul 05, 2018 am 11:29 AM
php

這篇文章主要介紹了關於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

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

適用於 Ubuntu 和 Debian 的 PHP 8.4 安裝和升級指南 適用於 Ubuntu 和 Debian 的 PHP 8.4 安裝和升級指南 Dec 24, 2024 pm 04:42 PM

PHP 8.4 帶來了多項新功能、安全性改進和效能改進,同時棄用和刪除了大量功能。 本指南介紹如何在 Ubuntu、Debian 或其衍生版本上安裝 PHP 8.4 或升級到 PHP 8.4

討論 CakePHP 討論 CakePHP Sep 10, 2024 pm 05:28 PM

CakePHP 是 PHP 的開源框架。它旨在使應用程式的開發、部署和維護變得更加容易。 CakePHP 基於類似 MVC 的架構,功能強大且易於掌握。模型、視圖和控制器 gu

CakePHP 檔案上傳 CakePHP 檔案上傳 Sep 10, 2024 pm 05:27 PM

為了進行文件上傳,我們將使用表單助理。這是文件上傳的範例。

如何設定 Visual Studio Code (VS Code) 進行 PHP 開發 如何設定 Visual Studio Code (VS Code) 進行 PHP 開發 Dec 20, 2024 am 11:31 AM

Visual Studio Code,也稱為 VS Code,是一個免費的原始碼編輯器 - 或整合開發環境 (IDE) - 可用於所有主要作業系統。 VS Code 擁有大量針對多種程式語言的擴展,可以輕鬆編寫

您如何在PHP中解析和處理HTML/XML? 您如何在PHP中解析和處理HTML/XML? Feb 07, 2025 am 11:57 AM

本教程演示瞭如何使用PHP有效地處理XML文檔。 XML(可擴展的標記語言)是一種用於人類可讀性和機器解析的多功能文本標記語言。它通常用於數據存儲

CakePHP 快速指南 CakePHP 快速指南 Sep 10, 2024 pm 05:27 PM

CakePHP 是一個開源MVC 框架。它使應用程式的開發、部署和維護變得更加容易。 CakePHP 有許多函式庫可以減少大多數常見任務的過載。

php程序在字符串中計數元音 php程序在字符串中計數元音 Feb 07, 2025 pm 12:12 PM

字符串是由字符組成的序列,包括字母、數字和符號。本教程將學習如何使用不同的方法在PHP中計算給定字符串中元音的數量。英語中的元音是a、e、i、o、u,它們可以是大寫或小寫。 什麼是元音? 元音是代表特定語音的字母字符。英語中共有五個元音,包括大寫和小寫: a, e, i, o, u 示例 1 輸入:字符串 = "Tutorialspoint" 輸出:6 解釋 字符串 "Tutorialspoint" 中的元音是 u、o、i、a、o、i。總共有 6 個元

在PHP API中說明JSON Web令牌(JWT)及其用例。 在PHP API中說明JSON Web令牌(JWT)及其用例。 Apr 05, 2025 am 12:04 AM

JWT是一種基於JSON的開放標準,用於在各方之間安全地傳輸信息,主要用於身份驗證和信息交換。 1.JWT由Header、Payload和Signature三部分組成。 2.JWT的工作原理包括生成JWT、驗證JWT和解析Payload三個步驟。 3.在PHP中使用JWT進行身份驗證時,可以生成和驗證JWT,並在高級用法中包含用戶角色和權限信息。 4.常見錯誤包括簽名驗證失敗、令牌過期和Payload過大,調試技巧包括使用調試工具和日誌記錄。 5.性能優化和最佳實踐包括使用合適的簽名算法、合理設置有效期、

See all articles