国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 開(kāi)發(fā) > PHP > 正文

詳解php魔術(shù)方法(Magic methods)的使用方法

2024-05-04 23:43:02
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
有些東西如果不是經(jīng)常使用,很容易忘記,比如魔術(shù)方法和魔術(shù)常量,這篇文章主要介紹了php魔術(shù)方法(Magic methods)的使用方法,感興趣的小伙伴們可以參考一下
 

PHP中把以?xún)蓚€(gè)下劃線__開(kāi)頭的方法稱(chēng)為魔術(shù)方法,這些方法在PHP中充當(dāng)了舉足輕重的作用。 魔術(shù)方法包括:

  • __construct(),類(lèi)的構(gòu)造函數(shù)
  • __destruct(),類(lèi)的析構(gòu)函數(shù)
  • __call(),在對(duì)象中調(diào)用一個(gè)不可訪問(wèn)方法時(shí)調(diào)用
  • __callStatic(),用靜態(tài)方式中調(diào)用一個(gè)不可訪問(wèn)方法時(shí)調(diào)用
  • __get(),獲得一個(gè)類(lèi)的成員變量時(shí)調(diào)用
  • __set(),設(shè)置一個(gè)類(lèi)的成員變量時(shí)調(diào)用
  • __isset(),當(dāng)對(duì)不可訪問(wèn)屬性調(diào)用isset()或empty()時(shí)調(diào)用
  • __unset(),當(dāng)對(duì)不可訪問(wèn)屬性調(diào)用unset()時(shí)被調(diào)用。
  • __sleep(),執(zhí)行serialize()時(shí),先會(huì)調(diào)用這個(gè)函數(shù)
  • __wakeup(),執(zhí)行unserialize()時(shí),先會(huì)調(diào)用這個(gè)函數(shù)
  • __toString(),類(lèi)被當(dāng)成字符串時(shí)的回應(yīng)方法
  • __invoke(),調(diào)用函數(shù)的方式調(diào)用一個(gè)對(duì)象時(shí)的回應(yīng)方法
  • __set_state(),調(diào)用var_export()導(dǎo)出類(lèi)時(shí),此靜態(tài)方法會(huì)被調(diào)用。
  • __clone(),當(dāng)對(duì)象復(fù)制完成時(shí)調(diào)用

__construct()和__destruct()

構(gòu)造函數(shù)和析構(gòu)函數(shù)應(yīng)該不陌生,他們?cè)趯?duì)象創(chuàng)建和消亡時(shí)被調(diào)用。例如我們需要打開(kāi)一個(gè)文件,在對(duì)象創(chuàng)建時(shí)打開(kāi),對(duì)象消亡時(shí)關(guān)閉

<?php class FileRead{ protected $handle = NULL; function __construct(){  $this->handle = fopen(...); } function __destruct(){  fclose($this->handle); }}?>

這兩個(gè)方法在繼承時(shí)可以擴(kuò)展,例如:

<?php class TmpFileRead extends FileRead{ function __construct(){  parent::__construct(); } function __destruct(){  parent::__destruct(); }}?>

__call()和__callStatic()

在對(duì)象中調(diào)用一個(gè)不可訪問(wèn)方法時(shí)會(huì)調(diào)用這兩個(gè)方法,后者為靜態(tài)方法。這兩個(gè)方法我們?cè)诳勺兎椒ǎ╒ariable functions)調(diào)用中可能會(huì)用到。

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

當(dāng)get/set一個(gè)類(lèi)的成員變量時(shí)調(diào)用這兩個(gè)函數(shù)。例如我們將對(duì)象變量保存在另外一個(gè)數(shù)組中,而不是對(duì)象本身的成員變量

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

當(dāng)我們?cè)趫?zhí)行serialize()和unserialize()時(shí),會(huì)先調(diào)用這兩個(gè)函數(shù)。例如我們?cè)谛蛄谢粋€(gè)對(duì)象時(shí),這個(gè)對(duì)象有一個(gè)數(shù)據(jù)庫(kù)鏈接,想要在反序列化中恢復(fù)鏈接狀態(tài),則可以通過(guò)重構(gòu)這兩個(gè)函數(shù)來(lái)實(shí)現(xiàn)鏈接的恢復(fù)。例子如下:

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

對(duì)象當(dāng)成字符串時(shí)的回應(yīng)方法。例如使用echo $obj;來(lái)輸出一個(gè)對(duì)象

<?php// Declare a simple classclass TestClass{ public function __toString() {  return 'this is a object'; }}$class = new TestClass();echo $class;?>

這個(gè)方法只能返回字符串,而且不可以在這個(gè)方法中拋出異常,否則會(huì)出現(xiàn)致命錯(cuò)誤。

__invoke()

調(diào)用函數(shù)的方式調(diào)用一個(gè)對(duì)象時(shí)的回應(yīng)方法。如下

<?phpclass CallableClass { function __invoke() {  echo 'this is a object'; }}$obj = new CallableClass;var_dump(is_callable($obj));?>

__set_state()

調(diào)用var_export()導(dǎo)出類(lèi)時(shí),此靜態(tài)方法會(huì)被調(diào)用。

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

當(dāng)對(duì)象復(fù)制完成時(shí)調(diào)用。例如在設(shè)計(jì)模式詳解及PHP實(shí)現(xiàn):?jiǎn)卫J揭晃闹刑岬降膯卫J綄?shí)現(xiàn)方式,利用這個(gè)函數(shù)來(lái)防止對(duì)象被克隆。

<?php public class Singleton { private static $_instance = NULL; // 私有構(gòu)造方法  private function __construct() {} public static function getInstance() {  if (is_null(self::$_instance)) {   self::$_instance = new Singleton();  }  return self::$_instance; } // 防止克隆實(shí)例 public function __clone(){  die('Clone is not allowed.' . E_USER_ERROR); }}?>

魔術(shù)常量(Magic constants)

PHP中的常量大部分都是不變的,但是有8個(gè)常量會(huì)隨著他們所在代碼位置的變化而變化,這8個(gè)常量被稱(chēng)為魔術(shù)常量。

  • __LINE__,文件中的當(dāng)前行號(hào)
  • __FILE__,文件的完整路徑和文件名
  • __DIR__,文件所在的目錄
  • __FUNCTION__,函數(shù)名稱(chēng)
  • __CLASS__,類(lèi)的名稱(chēng)
  • __TRAIT__,Trait的名字
  • __METHOD__,類(lèi)的方法名
  • __NAMESPACE__,當(dāng)前命名空間的名稱(chēng)

這些魔術(shù)常量常常被用于獲得當(dāng)前環(huán)境信息或者記錄日志。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助。



注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到PHP教程頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 麟游县| 扎赉特旗| 中宁县| 洞口县| 沙湾县| 娄烦县| 齐齐哈尔市| 阳西县| 镇巴县| 怀安县| 岱山县| 连江县| 临沂市| 贺兰县| 万荣县| 五原县| 密山市| 文成县| 昌吉市| 舞阳县| 富裕县| 罗城| 信宜市| 长岭县| 芦山县| 满城县| 英山县| 苍梧县| 班戈县| 柳江县| 盐亭县| 澎湖县| 塘沽区| 千阳县| 泰顺县| 宁晋县| 双桥区| 包头市| 萨迦县| 寻甸| 苍山县|