在OOP语言中,重载是定义一个和已有方法同名的方法,当然,返回值,或者参数类型会发生改变。
但是,在PHP中,重载完全不是这种概念。PHP 中的重载是创建一个没有定义的方法或者属性。
- PHP中重载属性非常容易理解,本质上就是内部创建一个数值,然后提供
__set()/__get()
方法,来增减私有数值的元素。以此达到”重载属性”的目的。
- 从OOP语言角度而言,这是一种很常见的做法,但是在OOP中这种做法不叫重载。将有这种功能的类成为
POJO
或者JavaBean
。
- 从OOP语言角度而言,这是一种很常见的做法,但是在OOP中这种做法不叫重载。将有这种功能的类成为
- PHP中重载函数相对于重载属性有点难理解,但也是可以理解的。重载函数本质上是对PHP中可变函数的一种使用。在OOP语言中,没有所谓的可变函数的说法,也没有类似的功能。然而,可变函数的使用,一定会导致代码的可读性变差。那么,PHP中,重载函数到底是什么呢?其实,就是在类的内容定义一个可变函数
__call($func,$arg)
,然后,在使用该类的实例的时候,就可以使用该可变函数定义好的函数,也就是所谓的”重载函数“
- 在JS,Python等类似的语言中,也有这种可变函数,甚至在C语言中,也有这种功能。但是在OOP语言,比如Java中就不存在类似的功能。有时候写Java的时候,也希望有这种功能的存在,但是,无论如何,这种可变函数,确实降低了代码的可读性~
来看一个重载属性的例子:
class Car {
private $ary = array();
public function __set($key, $val) {
$this->ary[$key] = $val;
}
public function __get($key) {
if (isset($this->ary[$key])) {
return $this->ary[$key];
}
return null;
}
public function __isset($key) {
if (isset($this->ary[$key])) {
return true;
}
return false;
}
public function __unset($key) {
unset($this->ary[$key]);
}
}
$car = new Car();
$car->name = '汽车'; //name属性动态创建并赋值
echo $car->name;
和一个重载函数的例子:
class Car {
public $speed = 0;
public function __call($name, $args) {
if ($name == 'speedUp') {
$this->speed += 10;
}
}
}
$car = new Car();
$car->speedUp(); //调用不存在的方法会使用重载
echo $car->speed;
从这个重载函数的例子可以看出,这种对于函数的重载并没有什么实际的意义。毕竟,在实际需求中,往往不需要重载一个叫speedUp
的函数。如果,我们在自己的类中重载一个其他的函数,比如叫say
,但是意义也并不明显。通过这种容易产生歧义的方式去定义函数,必然大大降低代码的可读性。实际开发中,还不如直接定义一个叫say
的方法来得时在。
另外,例子代码来自幕客网