我刚从书中读到:
“在PHP 5中,除了构造函数之外,任何派生类在重写方法时必须使用相同的签名”
从评论中的PHP手册:
“在重写中,方法名称和参数(arg)必须相同
例如:
class P {public function getName(){}}
C类扩展P {public function getName(){}}
“
那么为什么我能用其他参数和数量替换方法呢?这是合法的还是将来会引发错误,或者我只是遗漏了什么?
PHP Version 5.5.11
class Pet {
protected $_name;
protected $_status = 'None';
protected $_petLocation = 'who knows';
// Want to replace this function
protected function playing($game = 'ball') {
$this->_status = $this->_type . ' is playing ' . $game;
return '<br>' . $this->_name . ' started to play a ' . $game;
}
public function getPetStatus() {
return '<br>Status: ' . $this->_status;
}
}
class Cat extends Pet {
function __construct() {
$this->_type = 'Cat';
echo 'Test: The ' . $this->_type . ' was born ';
}
// Replacing with this one
public function playing($gameType = 'chess', $location = 'backyard') {
$this->_status = 'playing ' . $gameType . ' in the ' . $location;
return '<br>' . $this->_type . ' started to play a ' . $gameType . ' in the ' . $location;
}
}
$cat = new Cat('Billy');
echo $cat->getPetStatus();
echo $cat->playing();
echo $cat->getPetStatus();
这将输出:
测试:猫出生了
现状:无
猫开始在后院下棋
现状:在后院下棋
答案 0 :(得分:6)
规则是方法签名必须与它覆盖的方法兼容。让我们看一下层次结构中的两种方法:
protected function playing($game = 'ball');
public function playing($gameType = 'chess', $location = 'backyard');
变化:
可见性:protected
- &gt; public
;增加可见性是兼容的(相反会导致错误)。
参数:无变化(所需参数数量相同)
答案 1 :(得分:2)
PHP不支持overloading的描述方式。但是,参数必须只是相同的类型(即整数,字符串,数组等)。您可能有其他参数,这些参数特定于覆盖方法,但初始参数必须与父类的参数匹配。
这也可能是PHP function overloading的副本。