PHP類別的魔術方法(Magic Method)簡潔總結

高洛峰
發布: 2023-03-04 15:40:02
原創
1405 人瀏覽過

1. __construct()和__destruct()

在實例被 創建/銷毀 的時候被調用,都可以傳遞0個或多個參數。

class A
 {
  function A()
  {
   echo "build A";
  }
 
  function __destruct()
  {
   echo "destroy A";
  }
 }
 
 $obj = new A();
 //unset($obj);
登入後複製

   

Note:The destructor method will be called as soon as there are no other references to a particular object, or in as there are no other references to a particular object, or in as there are no 5.開始,一個定義在某個特定的命名空間裡的class中以類別名稱命名的方法將不再被視為建構子。在無命名空間的類別中與原來一樣依舊是建構子。如:

namespace Foo;
class Bar {
  public function Bar() {
    // treated as constructor in PHP 5.3.0-5.3.2
    // treated as regular method as of PHP 5.3.3
  }
}
登入後複製

   

如果沒有namespace Foo; 那麼Bar()也將被當作建構子。另外,如果有下面的情況:

function __construct()
  {
   echo "construct A";
  }
 
  function A()
  {
   echo "build A";
  }
 
  function __destruct()
  {
   echo "destroy A";
  }
 }
登入後複製

   

即既包含__construct()又包含與類別名稱同名的函數,那麼只會呼叫__construct()。

2. __call()和__callStatic()

當嘗試呼叫一個不存在的方法時呼叫該方法。兩個參數,一個是方法名,一個是被呼叫方法的參數陣列。

class MethodTest
{
  public function __call($name, $arguments)
  {
    // Note: value of $name is case sensitive.
    echo "Calling object method '$name' "
       . implode(&#39; &#39;, $arguments). "<br>";
  }
 
  public static function __callStatic($name, $arguments)
  {
    // Note: value of $name is case sensitive.
    echo "Calling static method &#39;$name&#39; "
       . implode(&#39; &#39;, $arguments). "<br>";
  }
}
 
$obj = new MethodTest;
$obj->runTest(&#39;in&#39;,&#39;object&#39;,&#39;context&#39;);
MethodTest::runTest(&#39;in&#39;,&#39;static&#39;,&#39;context&#39;);
登入後複製

   

其中,$arguments作為一個array傳入。運行結果:

Calling object method 'runTest' in object context

Calling static method 'runTest' in static context


也要注意函數的作用域protected和private:

__set()

  當試圖讀取一個物件並不存在的屬性的時候被呼叫。

  Note:我們可以用這個函數實作類似java中反射的各種操作。

class TestMagicCallMethod {
  public function foo()
  {
    echo __METHOD__.PHP_EOL."<br>";
  }
 
  public function __call($method, $args)
  {
    echo __METHOD__.PHP_EOL."<br>";
    if(method_exists($this, $method))
    {
      $this->$method();
    }
  }
   
  protected function bar()
  {
    echo __METHOD__.PHP_EOL."<br>";
  }
 
  private function baz()
  {
    echo __METHOD__.PHP_EOL."<br>";
  }
}
 
$test  =  new TestMagicCallMethod();
$test->foo();
/**
 * Outputs:
 * TestMagicCallMethod::foo
 */
 
$test->bar();
/**
 * Outputs:
 * TestMagicCallMethod::__call
 * TestMagicCallMethod::bar
 */
 
$test->baz();
/**
 * Outputs:
 * TestMagicCallMethod::__call
 * TestMagicCallMethod::baz
 */
登入後複製

   

輸出:

name not exists

name = abc

4. __toString()

 這個方法類似於這個方法的函數,必須回傳一個string。

class Test
{
  public function __get($key)
  {
   echo $key . " not exists";
  }
  public function __set($key,$value)
  {
   echo $key . " = ".$value;
  }
}
 
$t = new Test();
echo $t->name."<br>";
$t->name = "abc";
登入後複製

   

輸出:

name : abc, age : 12

更多PHP類的中魔術方法(Magic Method)簡明總結

更多PHP類的中文魔術方法(Magic Method)簡明總結

(P相關文章!

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