0

我正在研究 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中是否存在泛型?

4

4 回答 4

3

公共抽象函数 select($order="desc"); 和公共函数 select($order) 不匹配。从抽象函数中删除默认值。

于 2013-10-08T00:14:35.030 回答
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();
于 2013-10-08T00:51:39.580 回答
0

您需要做的就是将扩展方法更改为:

public function select($order="some other value") // here is the problem error
   {
      // selection code 
   }

本质上是因为原始方法具有默认值,所以所有覆盖都必须具有默认值。

为了做你想做的事,你必须使 $order 成为 Parent 的对象属性并更改方法签名以摆脱 $order 参数。然后在任何特定的实现中,您可以简单地将 $order 设置为您想要的任何其他内容。

于 2013-10-08T00:20:23.390 回答
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)

查看文档以获取更多示例

于 2015-07-09T10:24:34.927 回答