在OOP语言中,重载是定义一个和已有方法同名的方法,当然,返回值,或者参数类型会发生改变。
但是,在php中,重载完全不是这种概念。PHP 中的重载是创建一个没有定义的方法或者属性。
PHP中重载属性非常容易理解,本质上就是内部创建一个数值,然后提供__set()/__get()
方法,来增减私有数值的元素。以此达到”重载属性”的目的。 从OOP语言角度而言,这是一种很常见的做法,但是在OOP中这种做法不叫重载。将有这种功能的类成为POJO
或者javaBean
。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
的方法来得时在。
另外,例子代码来自幕客网
新闻热点
疑难解答
图片精选