Php 简明教程

PHP - Overloading

在 C++ 或 Java 中,此术语表示一个类可以多次定义名称相同但参数和/或返回类型不同的类方法。在 PHP 中,“重载”一词有不同的解释。它是一个可以使用该术语动态创建属性和方法的功能。PHP 的魔术方法(以双下划线开头的名称方法)用于设置动态属性和方法。

在处理未声明或在当前范围内不可见的属性或方法时,会调用用于重载目的的魔术方法。

Property Overloading

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

在此,

  1. __set() 用于向受保护的、私有的或不存在的不可访问属性写入数据。

  2. __get() 从不可访问属性读取数据。

  3. __isset() 对不可访问属性调用 isset() 或 empty()。

  4. 在不可访问的属性上调用 unset() 时调用 __unset()

上面使用的 $name 参数是要设置或检索的属性的名称。__set() 方法的 $value 参数指定要分配给属性的值。

_isset() 方法检查某个属性是否已经设置。 _unset() 方法移除属性。

Property overloading 仅在 object context 中起作用。在任何 static context 中,这些魔术方法都不会被触发。因此它们不应该被声明为 static。

Example

在下面的代码中,设置和检索了一个名为 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;
?>

它将生成以下 output

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));

Method Overloading

用于动态设置方法的两种魔术方法是 _call()_callStatic()

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

当在对象上下文中调用不可访问(未定义或私有)方法时,触发 _call()。另一方面,当在静态上下文中调用不可访问的方法时,触发 _callStatic()。

Example

以下示例演示了 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!");
?>

它将生成以下 output

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

请注意,“ ”运算符的使用表示该方法是 instance method ,“::”运算符表示该方法是 static method