PHP中的魔術方法總結和使用執行個體_PHP教程

來源:互聯網
上載者:User

PHP中的魔術方法總結和使用執行個體


  這篇文章主要介紹了PHP中的魔術方法總結和使用執行個體,魔術方法是PHP物件導向中特有的特性,它們在特定的情況下被觸發,都是以雙底線開頭,你可以把它們理解為鉤子,需要的朋友可以參考下

  魔術方法是PHP物件導向中特有的特性。它們在特定的情況下被觸發,都是以雙底線開頭,你可以把它們理解為鉤子,利用模式方法可以輕鬆實現PHP物件導向中重載(Overloading即動態建立類屬性和方法)。魔術方法很多還是成對出現的,以下列出目前PHP中所有的模式方法。

  1.__construct,__destruct

  __constuct構建對象的時被調用;

  __destruct明確銷毀對象或指令碼結束時被調用;

  2.__get,__set

  __set當給不可訪問或不存在屬性賦值時被調用

  __get讀取不可訪問或不存在屬性時被調用

  3.__isset,__unset

  __isset對不可訪問或不存在的屬性調用isset()或empty()時被調用

  __unset對不可訪問或不存在的屬性進行unset時被調用

  4.__call,__callStatic

  __call調用不可訪問或不存在的方法時被調用

  __callStatic調用不可訪問或不存在的靜態方法時被調用

  5.__sleep,__wakeup

  __sleep當使用serialize時被調用,當你不需要儲存大對象的所有資料時很有用

  __wakeup當使用unserialize時被調用,可用於做些對象的初始化操作

  6.__clone

  進行對象clone時被調用,用來調整對象的複製行為

  7.__toString

  當一個類被轉換成字串時被調用

  8.__invoke

  當以函數方式調用對象時被調用

  9.__set_state

  當調用var_export()匯出類時,此靜態方法被調用。用__set_state的傳回值做為var_export的傳回值。

  10.__debuginfo

  當調用var_dump()列印對象時被調用(當你不想列印所有屬性)適用於PHP5.6版本

  PHP魔術方法使用執行個體如下:

  ?

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

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

class Magic

{

public $var = 'test';

//建構函式,在建立對象的時候調用

public function __construct()

{

echo '__construct called'.PHP_EOL;

}

//某個對象的引用都被刪除、對象被銷毀、調用exit()後、指令碼關閉時被調用

public function __destruct()

{

echo '__destruct called'.PHP_EOL;

}

//當給不可訪問或不存在屬性賦值時被調用

public function __set($name, $value)

{

echo $name.'-'.$value;

echo '__set called'.PHP_EOL;

}

//讀取不可訪問或不存在屬性時被調用

public function __get($name)

{

echo $name;

echo '__get called'.PHP_EOL;

}

//調用不可訪問或不存在的方法時被調用

public function __call($name, $arguments)

{

echo $name . '-' . implode(',', $arguments);

echo '__call called'.PHP_EOL;

}

//調用不可訪問或不存在的靜態方法時被調用

public static function __callStatic($name, $arguments)

{

echo $name . '-' . implode(',', $arguments);

echo '__callStatic called'.PHP_EOL;

}

//對不可訪問或不存在的屬性調用isset()或empty()時被調用

public function __isset($name)

{

echo $name;

echo '__isset called'.PHP_EOL;

return true;

}

//對不可訪問或不存在的屬性進行unset時被調用

public function __unset($name)

{

echo $name;

echo '__unset called'.PHP_EOL;

}

//serialize時被調用,當你不需要儲存大對象的所有資料時很有用

public function __sleep()

{

echo '__sleep called'.PHP_EOL;

return array('var1111111111');

}

//unserialize時被調用,可用於做些對象的初始化操作

public function __wakeup()

{

echo '__wakeup called'.PHP_EOL;

$this->var = 'test after wakeup';

}

//當一個類被轉換成字串時被調用

public function __toString()

{

return '__toString called'.PHP_EOL;

}

//進行對象clone時被調用,用來調整對象的複製行為

public function __clone()

{

echo '__clone called'.PHP_EOL;

}

//當以函數方式調用對象時被調用

public function __invoke()

{

echo '__invoke called'.PHP_EOL;

}

//當調用var_export()匯出類時,此靜態方法被調用。用__set_state的傳回值做為var_export的傳回值。

public static function __set_state($arr)

{

return '__set_state called'.PHP_EOL;

}

//當調用var_dump()列印對象時被調用(當你不想列印所有屬性)適用於PHP5.6版本

public function __debuginfo($arr)

{

echo '__debuginfo called'.PHP_EOL;

return array(

'var' => 'test fro __debuginfo'

);

}

}

$m = new Magic(); //__construct()被調用

$m->not_exist_property = test; //__set()被調用

echo $m->not_exist_property;//__get()被調用

$m->abc(1,2,3); //__call()被調用

echo isset($m->not_exist_property); //__isset()被調用,返回bool值

unset($m->not_exist_property); //__unset()被調用

echo $tmp = serialize($m); //__sleep()被調用

unserialize($tmp); //__wakeup()被調用

$m1 = clone $m; //__clone()被調用,對象預設是引用傳遞,使用clone關鍵詞則可實現對象複製

$m(); //__invoke()

eval( '$m2 = ' . var_export ( $m , true ) . ';' );var_dump($m2);

var_dump($m);

//最後__destruct()被調用

/*

結果:

__construct called

not_exist_property-test__set called

not_exist_property__get called

abc-1,2,3__call called

not_exist_property__isset called

1not_exist_property__unset called

__sleep called

O:5:"Magic":1:{s:13:"var1111111111";N;}__wakeup called

__destruct called

__clone called

__invoke called

string(20) "__set_state called

"

class Magic#1 (1) {

public $var =>

string(4) "test"

}

__destruct called

__destruct called

*/

http://www.bkjia.com/PHPjc/998363.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/998363.htmlTechArticlePHP中的魔術方法總結和使用執行個體 這篇文章主要介紹了PHP中的魔術方法總結和使用執行個體,魔術方法是PHP物件導向中特有的特性,它們在特定的情...

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.