我正在进行OOP实施,我有以下内容:
abstract class Parent{
public abstract function select($order="desc");
}
class Child extends Parent{
public function select($order) // here is the problem error
{
// selection code
}
}
这会抛出一个错误,告诉我声明必须与父方法兼容。
我确实用正确的参数实现了它,除了我没有进行默认参数设置。
如果我希望有一天更改默认值,我不想复制100个类中相同的父方法原型。我怎么能这样做?
php中是否存在泛型?
答案 0 :(得分:3)
公共抽象函数select($ order =“desc”); 和公共功能选择($ order)不匹配。 从抽象函数中删除默认值。
答案 1 :(得分:1)
如果您想要更改常见默认值,我可以看到避免更新大量值的唯一方法是:
abstract class Parent{
const DEFAULT_SELECT_ORDER = "desc";
public abstract function select($order = "");
protected static function select_order(&$order)
{
if (empty($order) || !in_array(strtolower($order), array("asc", "desc"))) {
// additional test to check if the value is valid
$order = self::DEFAULT_SELECT_ORDER;
}
}
}
class Child extends Parent{
public function select($order = "") // here is the problem error
{
self::select_order($order);
// selection code
}
}
嗯 - 另一种可能更好的方法:
abstract class Parent {
protected $order = "desc";
public function order($order) {
if (in_array(strtolower($order), array("asc", "desc"))) {
$this->order = $order;
} else {
// probably should throw an exception or return false or something
}
return true;
}
public abstract function select();
}
class Child extends Parent {
public function select() {
// select code using $this->order
}
}
$query = new Child();
$query->order("asc");
$results = $query->select();
答案 2 :(得分:0)
您需要做的就是将扩展方法更改为:
public function select($order="some other value") // here is the problem error
{
// selection code
}
基本上因为原始方法具有默认值,所以ALL覆盖必须具有默认值。
为了做你想做的事,你必须让$ order命令为Parent的对象属性,并改变方法签名以摆脱$ order参数。然后在任何特定的实现中,您只需将$ order设置为您想要的任何其他内容。
答案 3 :(得分:0)
您可以使用我的小型库ValueResolver,例如:
$myVar = ValueResolver::resolve($var, $default);
并且不要忘记使用命名空间use LapaLabs\ValueResolver\Resolver\ValueResolver;
还可以进行类型转换,例如,如果您的变量的值应该是integer
,那么请使用:
$id = ValueResolver::toInteger('6 apples', 1); // returns 6
$id = ValueResolver::toInteger('There are no apples', 1); // returns 1 (used default value)
查看docs了解更多示例