php之魔術常量,魔術變數php

本文目錄一覽:

php 中的魔術常量有哪些

__sleep()serialize() 函數會檢查類中是否存在一個魔術方法 __sleep()。如果存在,該方法會先被調用,然後才執行序列化操作

__wakeup()unserialize() 會檢查是否存在一個 __wakeup() 方法。如果存在,則會先調用 __wakeup 方法,預先準備對象需要的資源。

__toString() 方法用於一個類被當成字元串時應怎樣回應,例如echo $obj;時調用

__invoke()當嘗試以調用函數的方式調用一個對象時,該方法會被調用

__set_state()起當調用 var_export() 導出類時,此方法會被調用

__debugInfo起當調用 var_dump() 導出類時,此方法會被調用

__set()在給不可訪問屬性賦值時,__set() 會被調用。

__get()讀取不可訪問屬性的值時,__get() 會被調用。

__isset()當對不可訪問屬性調用 isset() 或empty() 時,__isset() 會被調用。

__unset()當對不可訪問屬性調用 unset() 時,__unset() 會被調用。

__call()在對象中調用一個不可訪問方法時,__call() 會被調用。

__callStatic在靜態上下文中調用一個不可訪問方法時,__callStatic() 會被調用。

怎麼樣在php配置中載入魔術常量

PHP中,有不少很好用的魔術變數,用好之,能事半功倍,下面小結之: 

1 _LINE_ 

  顯示當前代碼的行數: 

  echo “This is line number : “. __LINE__; 

2 _FILE_ 

   顯示當前文件的路徑 

3 _METHOD_ 

   顯示當前方法的名,比如 

   class Magicconstant 

    function __construct() 

    { 

      echo “This is function a”; 

    } 

    function b() 

   {

     echo “br/”; 

     echo “This is function b”; 

     echo “br/”; 

     echo __METHOD__; 

   } 

$cm = new Magicconstant(); 

$cm-b(); 

顯示 

   This is function a 

  This is function b 

  Magicconstant::b 

4 _FUNCTION_ 

   顯示當前所在函數的名 

  function b() 

  { 

  echo “br/”; 

echo “This is function b”; 

echo “br/”; 

echo __FUNCTION__; 

  } 

輸出: 

   This is function b 

Magicconstant::b 

5 _DIR_ 

   顯示當前目錄名,如 

  echo “The directory name is : “. __DIR__; 

輸出: 

  The directory name is : D:\wamp\www 

6 _CLASS_ 

   顯示當前的類 

class Magicconstant 

function __construct() 

echo “The class name is : “.__CLASS__; 

$cm = new Magicconstant(); 

  顯示: 

  The class name is : Magicconstant 

7 _NAMESPACE_ 

   顯示當前命名空間 

namespace MagicConstant 

   echo “The namespace is : “.__NAMESPACE__; 

輸出: 

  The namespace is : MagicConstant 

8 _sleep_ 

  _sleep_用在將類序列化之前, 

?php 

class User 

public $userName = ”; 

public $userAddress = ”; 

public $userPhone = ”; 

public function setName($name=”) 

$this-userName = $name; 

function setAddress($address=”) 

$this-userAddress = $address; 

function setPhone($phone=”) 

$this-userPhone = $phone; 

function __sleep() 

return array(‘userAddress’,’userPhone’); 

                        // This will serialize only address and Phone number but not Name 

?php 

$User = new User(); 

$User-setName(‘Avinash’); 

$User-setAddress(‘Address Here’); 

$User-setPhone(‘1234567890’); 

$serialData = serialize($User); 

echo $serialData; 

OutPut: O:4:”User”:2:{s:11:”userAddress”;s:12:”Address Here”;s:9:”userPhone”;s:10:”1234567890″;} 

程序運行時, serialize() 檢查類中是否有 __sleep() ,如果有,則該函數將在任何序列化之前運行. 該函數必須返回一個需要進行序列化保存的成員屬性數組,並且只序列化該函數返回的這些成員屬性. 該函數有兩個作用: 第一. 在序列化之前,關閉對象可能具有的任何資料庫連接等. 第二. 指定對象中需要被序列化的成員屬性,如果某個屬性比較大而不需要儲存下來,可以不把它寫進__sleep()要返回的數組中,這樣該屬性就不會被序列化 

又如: 

class Test { 

public $mySecret; //我的秘密不想讓人知道 

public function __construct($secret) { 

$this-mySecret = $secret; 

public function __sleep() { 

$this-mySecret = “你休想知道我的秘密!”; 

return array(‘mySecret’); //一定要返回變數,不然返回的是個空,所以序列化也就沒有東西了。 

$test = new Test(“我的心裡話 我愛某某某”); 

echo serialize($test); //輸出 O:4:”Test”:1:{s:8:”mySecret”;s:28:”你休想知道我的秘密!”;} 

_wakeup_ 

用在反序列化時: 

?php 

class User 

public $userName = ”; 

public $userAddress = ”; 

public $userPhone = ”; 

public function setName($name=”) 

$this-userName = $name; 

function setAddress($address=”) 

$this-userAddress = $address; 

function setPhone($phone=”) 

$this-userPhone = $phone; 

function __sleep() 

return array(‘userAddress’,’userPhone’); 

                       // This will serialize only address and Phone number but not Name 

function __wakeup() 

echo “In Wakeup function”.”br/”; 

?php 

$User = new User(); 

$User-setName(‘Avinash’); 

$User-setAddress(‘Address Here’); 

$User-setPhone(‘1234567890’); 

$serialData = serialize($User); 

echo $serialData; 

echo “br/”; 

var_dump(unserialize($serialData)); 

Output: 

In Wakeup function 

object(User)#2 (3) { 

  [“userName”]= 

  string(0) “” 

  [“userAddress”]= 

  string(12) “Address Here” 

  [“userPhone”]= 

  string(10) “1234567890” 

//以上信息轉自 不代表個人觀點 僅供參考 若滿意 請採納本答案

幾個PHP 的「魔術常量」

幾個 PHP 的「魔術常量」

名稱

說明

__LINE__

文件中的當前行號。

__FILE__

文件的完整路徑和文件名。如果用在被包含文件中,則返回被包含的文件名。自

PHP 4.0.2 起,__FILE__

總是包含一個絕對路徑(如果是符號連接,則是解析後的絕對路徑),而在此之前的版本有時會包含一個相對路徑。

__DIR__

文件所在的目錄。如果用在被包括文件中,則返回被包括的文件所在的目錄。它等價於

dirname(__FILE__)。除非是根目錄,否則目錄中名不包括末尾的斜杠。(PHP 5.3.0中新增)

=

__FUNCTION__

函數名稱(PHP 4.3.0 新加)。自 PHP 5

起本常量返回該函數被定義時的名字(區分大小寫)。在

PHP 4 中該值總是小寫字母的。

__CLASS__

類的名稱(PHP 4.3.0 新加)。自 PHP 5

起本常量返回該類被定義時的名字(區分大小寫)。在

PHP 4 中該值總是小寫字母的。類名包括其被聲明的作用區域(例如

Foo\Bar)。注意自 PHP 5.4 起 __CLASS__

對 trait 也起作用。當用在 trait 方法中時,__CLASS__

是調用 trait 方法的類的名字。

__TRAIT__

Trait 的名字(PHP 5.4.0 新加)。自 PHP 5.4 起此常量返回 trait

被定義時的名字(區分大小寫)。Trait 名包括其被聲明的作用區域(例如

Foo\Bar)。

__METHOD__

類的方法名(PHP 5.0.0 新加)。返回該方法被定義時的名字(區分大小寫)。

__NAMESPACE__

當前命名空間的名稱(區分大小寫)。此常量是在編譯時定義的(PHP 5.3.0 新增)

PHP魔術常量怎麼用

例如需要打開一個文件,在對象創建時打開,對象消亡時關閉

?php

class FileRead

{

protected $handle = NULL;

function __construct(){

$this-handle = fopen(…);

}

function __destruct(){

fclose($this-handle);

}

}

?

這兩個方法在繼承時可以擴展,

例如:

?php

class TmpFileRead extends FileRead

{

function __construct(){

parent::__construct();

}

function __destruct(){

parent::__destruct();

}

}

?

__call()和__callStatic()

在對象中調用一個不可訪問方法時會調用這兩個方法,後者為靜態方法。

這兩個方法在可變方法(Variable functions)調用中可能會用到。

?php

class MethodTest

{

public function __call ($name, $arguments) {

echo “Calling object method ‘$name’ “. implode(‘, ‘, $arguments). “\n”;

}

public static function __callStatic ($name, $arguments) {

echo “Calling static method ‘$name’ “. implode(‘, ‘, $arguments). “\n”;

}

}

$obj = new MethodTest;

$obj-runTest(‘in object context’);

MethodTest::runTest(‘in static context’);

?

__get(),__set(),__isset()和__unset()

當get/set一個類的成員變數時調用這兩個函數。例如將對象變數保存在另外一個數組中,而不是對象本身的成員變數

?php

class MethodTest

{

private $data = array();

public function __set($name, $value){

$this-data[$name] = $value;

}

public function __get($name){

if(array_key_exists($name, $this-data))

return $this-data[$name];

return NULL;

}

public function __isset($name){

return isset($this-data[$name])

}

public function unset($name){

unset($this-data[$name]);

}

}

?

__sleep()和__wakeup()

當在執行serialize()和unserialize()時,會先調用這兩個函數。

例如在序列化一個對象時,這個對象有一個資料庫鏈接,想要在反序列化中恢復鏈接狀態,則可以通過重構這兩個函數來實現鏈接的恢復。例子如下:

?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();

}

}

?

__toString()

對象當成字元串時的回應方法。例如使用echo $obj;來輸出一個對象

?php

// Declare a simple class

class TestClass

{

public function __toString() {

return ‘this is a object’;

}

}

$class = new TestClass();

echo $class;

?

這個方法只能返回字元串,而且不可以在這個方法中拋出異常,否則會出現致命錯誤。

__invoke()

調用函數的方式調用一個對象時的回應方法。如下

?php

class CallableClass

{

function __invoke() {

echo ‘this is a object’;

}

}

$obj = new CallableClass;

var_dump(is_callable($obj));

?

__set_state()

調用var_export()導出類時,此靜態方法會被調用。

?php

class A

{

public $var1;

public $var2;

public static function __set_state ($an_array) {

$obj = new A;

$obj-var1 = $an_array[‘var1’];

$obj-var2 = $an_array[‘var2’];

return $obj;

}

}

$a = new A;

$a-var1 = 5;

$a-var2 = ‘foo’;

var_dump(var_export($a));

?

__clone()

當對象複製完成時調用。例如在設計模式詳解及PHP實現:單例模式一文中提到的單例模式實現方式,利用這個函數來防止對象被克隆。

?php

public class Singleton {

private static $_instance = NULL;

// 私有構造方法

private function __construct() {}

public static function getInstance() {

if (is_null(self::$_instance)) {

self::$_instance = new Singleton();

}

return self::$_instance;

}

// 防止克隆實例

public function __clone(){

die(‘Clone is not allowed.’ . E_USER_ERROR);

}

}

?

PHP中的預定義常量,類常量和魔術常量的區別

PHP 向它運行的任何腳本提供了大量的預定義常量。不過很多常量都是由不同的擴展庫定義的,只有在載入了這些擴展庫時才會出現,或者動態載入後,或者在編譯時已經包括進去了。

對於一些基本的常量是這些常量在 PHP 的內核中定義。它包含 PHP、Zend 引擎和 SAPI 模塊,如:

PHP_VERSION

PHP_OS

PHP_SAPI

PHP_EOL

對於一些是通過載入擴展庫才會出現,比如:

DIRECTORY_SEPARATOR (string)

PATH_SEPARATOR (string)

對於上面的常量是區分大小寫的。

有八個魔術常量它們的值隨著它們在代碼中的位置改變而改變。例如 __LINE__ 的值就依賴於它在腳本中所處的行來決定。這些特殊的常量不區分大小寫,也就是說魔術常量是不區分大小寫的。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/156653.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-18 01:57
下一篇 2024-11-18 01:57

相關推薦

  • int類型變數的細節與注意事項

    本文將從 int 類型變數的定義、聲明、初始化、範圍、運算和類型轉換等方面,對 int 類型變數進行詳細闡述和講解,幫助讀者更好地掌握和應用 int 變數。 一、定義與聲明 int…

    編程 2025-04-29
  • PHP和Python哪個好找工作?

    PHP和Python都是非常流行的編程語言,它們被廣泛應用於不同領域的開發中。但是,在考慮擇業方向的時候,很多人都會有一個問題:PHP和Python哪個好找工作?這篇文章將從多個方…

    編程 2025-04-29
  • Python input參數變數用法介紹

    本文將從多個方面對Python input括弧里參數變數進行闡述與詳解,並提供相應的代碼示例。 一、基本介紹 Python input()函數用於獲取用戶輸入。當程序運行到inpu…

    編程 2025-04-29
  • Python匿名變數的使用方法

    Python中的匿名變數是指使用「_」來代替變數名的特殊變數。這篇文章將從多個方面介紹匿名變數的使用方法。 一、作為佔位符 匿名變數通常用作佔位符,用於代替一個不需要使用的變數。例…

    編程 2025-04-29
  • PHP怎麼接幣

    想要在自己的網站或應用中接受比特幣等加密貨幣的支付,就需要對該加密貨幣擁有一定的了解,並使用對應的API進行開發。本文將從多個方面詳細闡述如何使用PHP接受加密貨幣的支付。 一、環…

    編程 2025-04-29
  • Python變數在內存中的存儲

    該文章將從多個方面對Python變數在內存中的存儲進行詳細闡述,包括變數的聲明和賦值、變數的引用和指向、內存地址的變化、內存管理機制等。 一、聲明和賦值 在Python中,變數聲明…

    編程 2025-04-29
  • Python變數類型用法介紹

    Python是一種解釋型編程語言,它提供了豐富的數據類型,包括數字、字元串、列表、元組、集合、字典等。Python變數類型的定義是Python程序開發的基礎,本文將從以下幾個方面對…

    編程 2025-04-28
  • Python print輸出變數

    Python是一種腳本語言,語法簡單易懂,目前被廣泛應用於數據處理、人工智慧、web開發、遊戲開發等領域。其中print函數是Python中最常用的函數之一,用於將變數輸出到控制台…

    編程 2025-04-28
  • Python定義變數

    Python是一門高級編程語言,變數是Python編程中非常重要的一個概念。Python的變數定義方式非常簡單,可以在程序中隨時定義一個變數來存儲數據,這方便了整個程序的邏輯編寫,…

    編程 2025-04-28
  • Python中如何定義一個變數

    Python是一種高級編程語言,使用它您可以輕鬆地定義和操作變數。Python中的變數屬於動態類型變數,因此不需要在定義變數時指定其類型,而是在變數分配之前自動確定變數的數據類型。…

    編程 2025-04-28

發表回復

登錄後才能評論