PHP中的可变参数函数和类型提示

| 速成一: 有什么方法可以在PHP中为可变参数函数强制执行类型?我假设没有,但是也许我错过了一些东西。 到目前为止,我只是强制使用所需类型的一个必需参数,并反复检查其余部分。
public function myFunction(MyClass $object){
    foreach(func_get_args() as $object){
        if(!($object instanceof MyClass)){
            // throw exception or something
        }
        $this->_objects[] = $object;
    }
}
有更好的解决方案吗? 目的: 一个容器对象,充当子对象的迭代列表,具有一些实用程序功能。用可变参数的构造函数调用它会是这样的:
// returned directly from include
return new MyParent(
    new MyChild($params),
    new MyChild($params),
    new MyChild($params)
);
另一个选择可以是
addChild
方法链:
$parent = new MyParent;
return $parent
    ->addChild(new MyChild($params))
    ->addChild(new MyChild($params))
    ->addChild(new MyChild($params));
子代也会对其构造函数采用几个参数,因此我正在尝试在易读性和处理费用之间取得平衡。     
已邀请:
        好吧,我想说这取决于参数的数量:)就像列表一样(所有参数1-n作为MyClass [在PHP 5.6之前,对于PHP 5.6+请参见可变参数函数)),您需要的更多编写每个参数(如您的问题所示),它可以发送更多参数,但只会检查定义的参数。 但是,您可以定义更多并使它们可选。因此,我为什么要写它取决于参数的数量:
public function myFunction(MyClass $object, MyClass $object2=null, MyClass $object3=null, MyClass $object4=null, ...){
    foreach(func_get_args() as $object){
        if(null === $object){
            // throw exception or something
        }
        $this->_objects[] = $object;
    }
}
在这样的示例中,当参数不是NULL且不是MyClass时,PHP就会已经抛出异常(如果传递默认值,则也可以传递NULL)。可选参数不应是返回值
func_get_args()
的一部分。我的意思是,如果您不传递第三个参数(此处称为
$object3
),它将不会出现在
func_get_args()
返回的数组中。 不知道这是否比问题中的代码更实用。 如果您在代码中遇到更多此类情况,则可以创建某种帮助程序以验证函数调用的输入,并委派使用该帮助程序发出的错误消息来抛出异常。这样可以防止重复代码,并在开发中提供更多的便利,因为您可以在为多种情况编写代码时使异常通知更好。 根据您的新反馈,如果您想首先让解释器进行检查工作,则只需进行一点迭代,然后执行addMember函数即可:
class MyParent {
    private $children = array();
    public function __construct() {
        foreach(func_get_args() as $object) $this->addChild($object);
    }
    public function addChild(MyChild $object) {
        $this->children[] = $object;
    }
}
用任何列表中错误类型的对象实例化该对象将阻止实例化Collection。 然后,您可以执行以下操作:
// returned directly from include
return new MyParent(
    new MyChild($params),
    new MyChild($params),
    new MyChild($params)
);
    
        现在,在PHP 5.6.x中,可以使用...运算符(在某些语言中也称为splat运算符): 例:
function addDateIntervalsToDateTime( DateTime $dt, DateInterval ...$intervals )
{
    foreach ( $intervals as $interval ) {
        $dt->add( $interval );
    }
    return $dt;
}
    

要回复问题请先登录注册