奇怪的PHP实现默认值

时间:2013-10-08 00:12:27

标签: php

我正在进行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 个答案:

答案 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了解更多示例