一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - PHP教程 - 詳解php魔術(shù)方法(Magic methods)的使用方法

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

2020-12-21 15:09PHP教程網(wǎng) PHP教程

有些東西如果不是經(jīng)常使用,很容易忘記,比如魔術(shù)方法和魔術(shù)常量,這篇文章主要介紹了php魔術(shù)方法(Magic methods)的使用方法,感興趣的小伙伴們可以參考一下

PHP中把以兩個下劃線__開頭的方法稱為魔術(shù)方法,這些方法在PHP中充當(dāng)了舉足輕重的作用。 魔術(shù)方法包括:

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

__construct()和__destruct()

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

php" id="highlighter_795690">
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
class FileRead
{
 protected $handle = NULL;
 
 function __construct(){
  $this->handle = fopen(...);
 }
 
 function __destruct(){
  fclose($this->handle);
 }
}
?>

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

?
1
2
3
4
5
6
7
8
9
10
11
12
<?php
class TmpFileRead extends FileRead
{
 function __construct(){
  parent::__construct();
 }
 
 function __destruct(){
  parent::__destruct();
 }
}
?>

__call()和__callStatic()

在對象中調(diào)用一個不可訪問方法時會調(diào)用這兩個方法,后者為靜態(tài)方法。這兩個方法我們在可變方法(Variable functions)調(diào)用中可能會用到。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?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()

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?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)我們在執(zhí)行serialize()和unserialize()時,會先調(diào)用這兩個函數(shù)。例如我們在序列化一個對象時,這個對象有一個數(shù)據(jù)庫鏈接,想要在反序列化中恢復(fù)鏈接狀態(tài),則可以通過重構(gòu)這兩個函數(shù)來實(shí)現(xiàn)鏈接的恢復(fù)。例子如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<?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()

對象當(dāng)成字符串時的回應(yīng)方法。例如使用echo $obj;來輸出一個對象

?
1
2
3
4
5
6
7
8
9
10
11
12
<?php
// Declare a simple class
class TestClass
{
 public function __toString() {
  return 'this is a object';
 }
}
 
$class = new TestClass();
echo $class;
?>

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

__invoke()

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

?
1
2
3
4
5
6
7
8
9
10
<?php
class CallableClass
{
 function __invoke() {
  echo 'this is a object';
 }
}
$obj = new CallableClass;
var_dump(is_callable($obj));
?>

__set_state()

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?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()

當(dāng)對象復(fù)制完成時調(diào)用。例如在設(shè)計(jì)模式詳解及PHP實(shí)現(xiàn):單例模式一文中提到的單例模式實(shí)現(xiàn)方式,利用這個函數(shù)來防止對象被克隆。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?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個常量會隨著他們所在代碼位置的變化而變化,這8個常量被稱為魔術(shù)常量。

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

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

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 性鸥美 | 日韩精品 欧美 | 青青草国产免费国产是公开 | 日韩精品免费一级视频 | 激情艳妇之性事高h | 99视频精品全部 在线 | 亚洲a视频在线观看 | 丰满岳乱妇在线观看视频国产 | 69老司机亚洲精品一区 | 日韩视频免费观看 | 男人都懂www深夜免费网站 | 超级碰碰青草免费视频92 | 亚洲无线一二三区2021 | 日产精品卡一卡2卡三卡乱码工厂 | www久久com| beeg日本高清xxxx18 | 91传媒制片厂果冻有限公司 | 日b视频免费 | 青青草国产精品久久久久 | 亚洲白拍 | 毛片一级毛片 | japanesepooping脱粪 | 日韩精品欧美国产精品亚 | 丝瓜草莓香蕉绿巨人幸福宝 | 91私密保健女子养生spa | 日本一区二区不卡久久入口 | 97国产精品久久碰碰牛牛 | 国产精品久久久久久 | 久久精品亚洲国产AV涩情 | 亚洲成年网站在线777 | 2019中文字幕 | 国内精品免费一区二区三区 | 欧美巨吊 | 日本中文字幕在线观看视频 | 高跟丝袜人妖sissy露出调教 | 臀控福利大臀的网站 | 黑人巨茎大战欧美白妇 | 男同gay玩奴男同玩奴 | 美女沟厕撒尿全过程高清图片 | 国产清纯女高中生在线观看 | 天天综合五月天 |