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
在此,
-
__set() 用于向受保护的、私有的或不存在的不可访问属性写入数据。
-
__get() 从不可访问属性读取数据。
-
__isset() 对不可访问属性调用 isset() 或 empty()。
-
在不可访问的属性上调用 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 。