示例类useSymfony\Component\OptionsResolver\OptionsResolver;classEmail{private$options;/***电子邮件构造函数。**@param数组$options*/publicfunction__construct(array$options=[]){$this->setOptions($options);}/***配置选项。**@param\Closure$closure*@paramnull$object**@returnarray*/protectedfunctionconfigureOptions(array$options,Closure$closure,$object=null){$resolver=newOptionsResolver();}$闭包($解析器);如果($objectinstanceofClosure){return$object()->options=$resolver->resolve($options);}if(is_object($object)){return$object->options=$resolver->resolve($options);}if(is_string($object)&&class_exists($object)){$object=new$object();返回$object->options=$resolver->;解决($选项);}返回$resolver->resolve($options);}/***@returnmixed*/publicfunctiongetOptions(){return$this->options;}/***@paramarray$options*/publicfunctionsetOptions(array$options):void{$this->options=$this->configureOptions($options,function(OptionsResolver$resolver){$resolver->setDefaults}(['host'=>'smtp.example.org','username'=>'user','password'=>'password','port'=>25,]);$resolver->setRequired(['主机','用户名','密码','端口']);$resolver->setAllowedTypes('主机','字符串');$resolver->setAllowedTypes('用户名','字符串');$resolver->setAllowedTypes('password','string');$resolver->setAllowedTypes('port','int');});}}选择项通过学校检查$email=newEmail(['host'=>'smtp.example.org','username'=>'user','password'=>'password','port'=>25,]);var_export($email);Email::__set_state(array('options'=>array('host'=>'smtp.example.org','username'=>'user','password'=>'password','port'=>25,),))选项验证失败$email=newEmail(['host'=>'smtp.example.org','username'=>'user','password'=>'password','port'=>'25',//请注意此处]);var_export($email);PHP致命错误:未捕获Symfony\Component\OptionsResolver\Exception\InvalidOptionsException:值为“25”的选项“port”是预期为“int”类型,但为“string”类型。综上所述,个人认为开发第三方sdk可以使用symfony/options-resolver组件来更好的验证客户端类的初始化参数,例如个人改编的Yii极光Push扩展包-yii-jpush中的应用。
