在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
的方法來得時在。
另外,例子代碼來自幕客網
新聞熱點
疑難解答
圖片精選