PHP使用未知参数扩展

时间:2011-09-22 08:07:50

标签: php oop function abstract-class

我有一个abstract班和孩子:

abstract class Cubique_Helper_Abstract {
    abstract public function execute();
}

class Cubique_Helper_Doctype extends Cubique_Helper_Abstract{
    public function execute($type) {}
}

如您所见,方法execute()很常见。但是所有类中的参数数量可能不同。我怎样才能通过不同的方法论来保持这种扩展?

这是我当前的错误:

Declaration of Cubique_Helper_Doctype::execute() must be compatible
with that of Cubique_Helper_Abstract::execute()

谢谢你我前进。

4 个答案:

答案 0 :(得分:3)

你可以用有限的论证来制作方法或功能。

function test(){
$num = func_num_args();
for ($i = 0;$i < $num;$i++)
{
    $arg[$i] = func_get_arg($i); 
}
    // process on arguments  
}

答案 1 :(得分:2)

  • 您可以从摘要中删除execute(),但您可能不希望这样做。

  • 你也可以给它一个数据对象作为参数,如:

    class MyOptions {
      public function getType(){}
      public function getStuff(){}
    }
    
    abstract class Cubique_Helper_Abstract {
        abstract public function execute(MyOptions $options);
    }
    
    class Cubique_Helper_Doctype extends Cubique_Helper_Abstract{
      public function execute(MyOptions $options) {
        $type = $options->getType();
      }
    }
    
  • 或者,你可以让它依赖于构造函数中的值并省略参数:

    abstract class Cubique_Helper_Abstract {
        abstract public function execute();
    }
    
    class Cubique_Helper_Doctype extends Cubique_Helper_Abstract{
      public function __construct($type) {
        // since __construct() is not in abstract, it can be different
        // from every child class, which let's you handle dependencies
        $this->type = $type;
      }
      public function execute() {
        // you have $this->type here
      }
    }
    

最后一个选择是我最喜欢的。这样,你真的确保你有依赖关系,到了execute()的时候,你不必给它任何参数。


我会不使用func_get_args() ,因为您忘记了依赖关系。例如:

class Cubique_Helper_Doctype extends Cubique_Helper_Abstract {
  public function execute() {
    $args = func_get_args();
    $type = $args[0];
    $title = $args[1];
    $content = $args[2];
    // do something, for example
    echo $type; // will always echo "" if you miss arguments, but you really want a fatal error
  }
}

$d = new Cubique_Helper_Doctype();
$d->execute();
// this is a valid call in php, but it ruins your application.
// you **want** it to fail so that you know what's wrong (missing dependencies)

答案 2 :(得分:1)

您可以使用func_get_arg,以便子类的方法签名相同。

答案 3 :(得分:1)

当参数数量不同时,您会收到错误:

Fatal error: Declaration of Cubique_Helper_Doctype::execute() must be compatible with that of Cubique_Helper_Abstract::execute() in C:\wamp\www\tests\41.php on line 16

所以你唯一的选择是让争论成为一个数组并传入实际的参数,或者在没有参数的情况下声明execute并用func_get_args或{{3}来模拟发送的参数}和func_get_arg