您好,登錄后才能下訂單哦!
這篇文章主要介紹“PHP中的重載是什么意思”,在日常操作中,相信很多人在PHP中的重載是什么意思問題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”PHP中的重載是什么意思”的疑惑有所幫助!接下來,請(qǐng)跟著小編一起來學(xué)習(xí)吧!
很多面試官在面試的時(shí)候都會(huì)問一些面向?qū)ο蟮膯栴},面向?qū)ο蟮娜筇匦灾校鄳B(tài)最主要的實(shí)現(xiàn)方式就是方法的重載和重寫。但是在PHP中,只有重寫,并沒有完全的重載能力的實(shí)現(xiàn)。
重寫,子類重寫父類方法。
// 重寫
class A
{
public function test($a)
{
echo 'This is A:' . $a, PHP_EOL;
}
}
class childA extends A
{
public function test($a)
{
echo 'This is A child:' . $a, PHP_EOL;
}
}
$ca = new childA();
$ca->test(1);
這個(gè)在PHP中是沒有任何問題的,子類可以重寫父類的方法。當(dāng)實(shí)例化子類的時(shí)候,調(diào)用的就是子類實(shí)現(xiàn)的重寫的方法。
重載,相同方法名但參數(shù)數(shù)量或者類型不同。
class A{
function foo($a){
echo $a;
}
// Fatal error: Cannot redeclare A::foo()
function foo($a, $b){
echo $a+$b;
}
}
抱歉,這樣寫的結(jié)果將會(huì)是直接的報(bào)錯(cuò)。PHP并不支持這樣的重載能力。而在PHP的官方手冊(cè)上,重載的定義是使用__set()、__get()、__call()、__callStatic()等魔術(shù)方法來對(duì)無法訪問的變量或方法進(jìn)行重載。這與我們所學(xué)習(xí)的面向?qū)ο笾械闹剌d完全不同,在手冊(cè)中的note里也有很多人對(duì)此提出了疑問。當(dāng)然,我們今天并不會(huì)再去講這些魔術(shù)方法的使用。關(guān)于它們的使用可以參考我們之前寫過的文章:PHP中的那些魔術(shù)方法(一)、PHP的那些魔術(shù)方法(二)
那么,在PHP中可以實(shí)現(xiàn)重載嗎?當(dāng)然可以,只不過會(huì)麻煩一些:
// 重載
class B
{
public function foo(...$args)
{
if (count($args) == 2) {
$this->fooAdd(...$args);
} else if (count($args) == 1) {
echo $args[0], PHP_EOL;
} else {
echo 'other';
}
}
private function fooAdd($a, $b)
{
echo $a + $b, PHP_EOL;
}
}
$b = new B();
$b->foo(1);
$b->foo(1, 2);
使用一個(gè)方法來調(diào)用其他方法,根據(jù)參數(shù)數(shù)量來進(jìn)行判斷,就可以實(shí)現(xiàn)參數(shù)數(shù)量不同的方法重載。
// 使用__call()進(jìn)行重載
class C
{
public function __call($name, $args)
{
if ($name == 'foo') {
$funcIndex = count($args);
if (method_exists($this, 'foo' . $funcIndex)) {
return $this->{'foo' . $funcIndex}(...$args);
}
}
}
private function foo1($a)
{
echo $a, PHP_EOL;
}
private function foo2($a, $b)
{
echo $a + $b, PHP_EOL;
}
private function foo3($a, $b, $c)
{
echo $a + $b + $c, PHP_EOL;
}
}
$c = new C();
$c->foo(1);
$c->foo(1, 2);
$c->foo(1, 2, 3);
使用__call()魔術(shù)方法或許會(huì)更簡(jiǎn)單,但也會(huì)讓一些新手在接手項(xiàng)目的時(shí)候蒙圈。畢竟魔術(shù)方法對(duì)IDE是不友好的,這樣的開發(fā)讓__call()成為了一個(gè)模板方法,由它來定義操作的算法骨架。我們也可以根據(jù)參數(shù)類型來模擬重載能力。
// 參數(shù)類型不同的重載
class D {
function __call($name, $args){
if($name == 'foo'){
if(is_string($args[0])){
$this->fooString($args[0]);
}else {
$this->fooInt($args[0]);
}
}
}
private function fooInt(int $a){
echo $a . ' is Int', PHP_EOL;
}
private function fooString(string $a){
echo $a . ' is String', PHP_EOL;
}
}
$d = new D();
$d->foo(1);
$d->foo('1');
不管怎么說,用上述方法實(shí)現(xiàn)的方法重載都非常麻煩,因?yàn)闀?huì)讓某一個(gè)方法或者魔術(shù)方法非常重,它需要成為一個(gè)控制器來根據(jù)參數(shù)對(duì)內(nèi)部的方法進(jìn)行調(diào)度。更多的情況下,我們應(yīng)該還是使用不同的方法名然后抽象公共的部分提取成獨(dú)立的私有內(nèi)部方法來實(shí)現(xiàn)不同方法名的“重載”。畢竟不同的語(yǔ)言還是要掌握它們不同的個(gè)性,并且根據(jù)這些個(gè)性靈活地運(yùn)用在我們的項(xiàng)目中。
到此,關(guān)于“PHP中的重載是什么意思”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。