本文目錄一覽:
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