你如何强制执行PHP方法参数?

el_*_*_le 3 php parameters methods

你如何验证/管理你的PHP方法参数,为什么这样做?

irc*_*ell 17

好吧,假设您正在讨论类型检查方法参数,它取决于:

  1. 如果它期待一个对象,我使用带接口的类型提示:

    public function foo(iBar $bar)
    
    Run Code Online (Sandbox Code Playgroud)
  2. 如果它只期望一个数组,我使用array关键字的类型提示.

    public function foo(array $bar)
    
    Run Code Online (Sandbox Code Playgroud)
  3. 如果它期望一个字符串,int,bool或float,我将它转换为:

    public function foo($bar) {
        $bar = (int) $bar;
    }
    
    Run Code Online (Sandbox Code Playgroud)
  4. 如果它期待混合,我只是检查一个级联:

    public function foo($bar) {
        if (is_string($bar)) {
            //handle string case
        } elseif (is_array($bar)) {
            //...
        } else {
            throw new InvalidArgumentException("invalid type");
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  5. 最后,如果它期望可迭代类型,我不使用类型提示.我首先检查它是否是一个数组,然后重新加载迭代器:

    public function foo($bar) {
        if (is_array($bar)) {
            $bar = new ArrayIterator($bar);
        }
        if (!$bar instanceof Traversable) {
            throw new InvalidArgumentException("Not an Iterator");
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  6. 如果它需要文件名或目录,只需确认is_file:

    public function foo($bar) {
        if (!is_file($bar)) {
            throw new InvalidArgumentException("File doesn't exist");
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

我认为处理大多数情况.如果你想到其他人,我很乐意回答他们......