PHP - 方法過載



在 C++ 或 Java 中,這個術語意味著一個類可以擁有多個同名但引數和/或返回型別不同的類方法。在 PHP 中,“過載”這個術語有不同的解釋。它是一個可以動態建立屬性和方法的特性。PHP 的魔術方法(方法名稱以雙下劃線開頭)用於設定動態屬性和方法。

用於過載目的的魔術方法在與未宣告的屬性或方法或當前作用域中不可見的方法互動時被呼叫。

屬性過載

PHP 魔術方法的例子有 __construct()、__destruct()、__toString() 等。PHP 使用以下魔術方法來過載屬性。

public __set ( string $name , mixed $value ) : void
public __get ( string $name ) : mixed
public __isset ( string $name ) : bool
public __unset ( string $name ) : void

這裡:

  • __set() 用於將資料寫入不可訪問的屬性(受保護的、私有的或不存在的)。

  • __get() 從不可訪問的屬性讀取資料。

  • __isset() 對不可訪問的屬性呼叫 isset() 或 empty()。

  • __unset() 在對不可訪問的屬性呼叫 unset() 時被呼叫。

上面使用的 $name 引數是要設定或檢索的屬性的名稱。__set() 方法的 $value 引數指定要賦給屬性的值。

__isset() 方法檢查某個屬性是否已設定。__unset() 方法刪除屬性。

屬性過載僅在物件上下文中有效。在任何靜態上下文中,這些魔術方法都不會被觸發。因此,它們不應宣告為靜態的。

示例

在下面的程式碼中,設定並檢索了一個名為 myprop 的動態屬性,該屬性未在類中宣告。

<?php
   class myclass {
      public function __set($name, $value) {
         echo "setting $name property to $value \n";
         $this->$name = $value;
      }

      public function __get($name) {
         echo "value of $name property is ";
         return $this->$name;
      }
   }

   $obj = new myclass();

   # This calls __set() method
   $obj->myproperty="Hello World!";

   # This call __get() method
   echo "Retrieving myproperty: " . $obj->myproperty . PHP_EOL;
?>

它將產生以下輸出

setting myproperty property to Hello World! 
Retrieving myproperty: Hello World!

__set()__get() 魔術方法還可以設定和檢索宣告為私有的屬性。在 myclass 中新增以下語句(在函式定義之前):

private $myproperty;

你可以透過在myclass中定義__isset()方法來檢查屬性:

public function __isset($name) {
   return isset($this->$name);
}

使用此語句檢查屬性是否已設定:

var_dump (isset($obj->myproperty));

在這種情況下,它返回true

要使用在myclass中定義的__unset()方法來取消設定動態建立的屬性:

public function __unset($name) {
   unset($this->$name);
}

以下程式碼將返回false

var_dump (isset($obj->myproperty));

方法過載

用於動態設定方法的兩個魔術方法是__call()__callStatic()

public __call (string $name , array $arguments) : mixed
public static __callStatic (string $name , array $arguments) : mixed

__call() 在物件上下文中呼叫不可訪問的方法(未定義或私有的)時被觸發。另一方面,__callStatic() 在靜態上下文中呼叫不可訪問的方法時被觸發。

示例

以下示例演示了 PHP 中的方法過載

<?php
   class myclass {
      public function __call($name, $args) {
	  
         // Value of $name is case sensitive.
         echo "Calling object method $name with " . implode(" ", $args). "\n";
      }
      public static function __callStatic($name, $args) {
         echo "Calling static method $name with " . implode(" ", $args). "\n";
      }
   }
   $obj = new myclass();

   # This invokes __call() magic method
   $obj->mymethod("Hello World!");

   # This invokes __callStatic() method
   myclass::mymethod("Hello World!");
?>

它將產生以下輸出

Calling object method mymethod with Hello World!
Calling static method mymethod with Hello World!

請注意,“->”運算子表示該方法是例項方法,“::”運算子表示該方法是靜態方法

廣告