php魔術方法比較使用實例程式碼詳解

伊谢尔伦
發布: 2023-03-14 09:26:01
原創
1434 人瀏覽過

PHP中把以兩個底線開頭的方法稱為魔術方法,這些方法在PHP中充當了舉足輕重的作用。

construct()和destruct()

#建構子和析構函數應該不陌生,他們在物件創建和消亡時被調用。例如我們需要打開一個文件,在物件建立時打開,物件消亡時關閉

<?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 &#39;$name&#39; ". implode(&#39;, &#39;, $arguments). "\n";
 }

 public static function callStatic ($name, $arguments) {
  echo "Calling static method &#39;$name&#39; ". implode(&#39;, &#39;, $arguments). "\n";
 }
}

$obj = new MethodTest;
$obj->runTest(&#39;in object context&#39;);
MethodTest::runTest(&#39;in static context&#39;);
?>
登入後複製

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(&#39;server&#39;, &#39;username&#39;, &#39;password&#39;, &#39;db&#39;);
 }

 public function wakeup()
 {
  $this->connect();
 }
}
?>
登入後複製

toString()

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

<?php
// Declare a simple class
class TestClass
{
 public function toString() {
  return &#39;this is a object&#39;;
 }
}

$class = new TestClass();
echo $class;
?>
登入後複製

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

invoke()

呼叫函數的方式呼叫一個物件時的回應方法。如下

<?php
class CallableClass 
{
 function invoke() {
  echo &#39;this is a object&#39;;
 }
}
$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[&#39;var1&#39;];
  $obj->var2 = $an_array[&#39;var2&#39;];
  return $obj;
 }
}

$a = new A;
$a->var1 = 5;
$a->var2 = &#39;foo&#39;;
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(&#39;Clone is not allowed.&#39; . E_USER_ERROR);
 }
}
?>
登入後複製

以上是php魔術方法比較使用實例程式碼詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板