示例类
use Symfony\Component\OptionsResolver\OptionsResolver;/** * Class Email * composer require symfony/options-resolver */class Email{ /** * Email constructor. * * @param array $options */ public function __construct(array $options = []) { $this->configureOptions($options, function (OptionsResolver $resolver){ $resolver->setDefaults([ 'host' => 'smtp.example.org', 'username' => 'user', 'password' => 'password', 'port' => 25, ]); $resolver->setRequired(['host', 'username', 'password', 'port']); $resolver->setAllowedTypes('host', 'string'); $resolver->setAllowedTypes('username', 'string'); $resolver->setAllowedTypes('password', 'string'); $resolver->setAllowedTypes('port', 'int'); }); } /** * @param array $options * @param \Closure $closure */ public function configureOptions(array $options, Closure $closure) { $resolver = new OptionsResolver; $closure($resolver); $this->options = $resolver->resolve($options); }}
正确的选贤
$email = new Email([ '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 = new Email([ 'host' => 'smtp.example.org', 'username' => 'user', 'password' => 'password', 'port' => '25', // 留神这里]);var_export($email);
PHP Fatal error: Uncaught Symfony\Component\OptionsResolver\Exception\InvalidOptionsException: The option "port" with value "25" is expected to be of type "int", but is of type "string".
总结
集体感觉可应用该 symfony/options-resolver 组件较好的对开发第三方 sdk 的客户端类初始化参数进行校验,例如集体适配的 Yii 极光推送扩大包 - yii-jpush 中的利用。