示例类

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 中的利用。