2013-04-15 60 views
4

我正在扩展一个类,但在某些情况下,我重写了一个方法。有时在2个参数中,有时在3个,有时没有参数。PHP - 使用不同数量的参数覆盖函数

不幸的是我得到了一个PHP警告。

我的最低可验证例如: http://pastebin.com/6MqUX9Ui

<?php 

class first { 
    public function something($param1) { 
     return 'first-'.$param1; 
    } 
} 

class second extends first { 
    public function something($param1, $param2) { 
     return 'second params=('.$param1.','.$param2.')'; 
    } 
} 

// Strict standards: Declaration of second::something() should be compatible with that of first::something() in /home/szymon/webs/wildcard/www/source/public/override.php on line 13 

$myClass = new Second(); 
var_dump($myClass->something(123,456)); 

我收到PHP错误/警告/信息: error screen

如何防止这样的错误?

+3

你不能因为它违反了LSP http://en.wikipedia.org/wiki/Liskov_substitution_principle –

+0

请访问http:// stackoverflow.com/questions/3115388/ – Uberfuzzy

回答

0

你的接口/抽象类或最父类,应cotantin的PARAMS的方法可以收到的最大数量,你可以明确地声明它们为NULL,所以如果他们不给,不会发生错误即

Class A{ 
public function smth($param1, $param2='', $param3='') 

Class B extends A { 
public function smth($param1, $param2, $param3='') 

Class C extends B { 
public function smth($param1, $param2, $param3); 

在这种情况下,使用smth()作为'A'对象的方法,您将只使用一个参数($ param1),但使用与对象'B'相同的方法将被忽略使用2个参数($ param1,$ param2),并从C实例化你必须给所有的参数

5

你可以很容易地重新定义方法添加新的论据,这只是需要一个新的参数是可选(在你的签名中有一个默认值)。请看下图:

class Parent 
{ 
    protected function test($var1) { 
     echo($var1); 
    } 
} 

class Child extends Parent 
{ 
    protected function test($var1, $var2 = null) { 
     echo($var1); 
     echo($var1); 
    } 
} 

有关更多详细信息,请查看链接:http://php.net/manual/en/language.oop5.abstract.php