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!

请注意,“->”运算符表示该方法是实例方法,“::”运算符表示该方法是静态方法

广告
© . All rights reserved.