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

发布于 2024-10-11 22:30:32 字数 32 浏览 2 评论 0原文

如何验证/管理 PHP 方法参数以及为什么这样做?

How do you validate/manage your PHP method arguments and why do you do it this way?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

别低头,皇冠会掉 2024-10-18 22:30:32

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

  1. 如果它需要一个对象,我使用 带有接口的类型提示

    公共函数 foo(iBar $bar)
    
  2. 如果它只需要一个数组,我会使用带有 array 关键字的类型提示。

    公共函数 foo(数组 $bar)
    
  3. 如果它需要一个字符串、int、bool 或 float,我会强制转换它:

    公共函数 foo($bar) {
        $bar = (int) $bar;
    }
    
  4. 如果它需要混合,我只需检查级联:

    公共函数 foo($bar) {
        如果 (is_string($bar)) {
            //处理字符串大小写
        } elseif (is_array($bar)) {
            //...
        } 别的 {
            throw new InvalidArgumentException("无效类型");
        }
    }
    
  5. 最后,如果它期望可迭代类型,我不使用类型提示。我首先检查它是否是一个数组,然后重新加载迭代器:

    公共函数 foo($bar) {
        如果 (is_array($bar)) {
            $bar = new ArrayIterator($bar);
        }
        if (!$bar instanceof 可遍历) {
            throw new InvalidArgumentException("不是迭代器");
        }
    }
    
  6. 如果它需要文件名或目录,只需使用 is_file 进行确认:

    公共函数 foo($bar) {
        if (!is_file($bar)) {
            throw new InvalidArgumentException("文件不存在");
        }
    }
    

我认为这可以处理大多数情况。如果您想到其他任何问题,我很乐意尝试回答...

Well, assuming that you're talking about type-checking method arguments, it depends:

  1. If it's expecting an object, I use type-hinting with an interface:

    public function foo(iBar $bar)
    
  2. If it's expecting an array only, I use type-hinting with the array keyword.

    public function foo(array $bar)
    
  3. If it's expecting a string, int, bool or float, I cast it:

    public function foo($bar) {
        $bar = (int) $bar;
    }
    
  4. If it's expecting mixed, I just check in a cascade:

    public function foo($bar) {
        if (is_string($bar)) {
            //handle string case
        } elseif (is_array($bar)) {
            //...
        } else {
            throw new InvalidArgumentException("invalid type");
        }
    }
    
  5. Lastly, if it's expecting an iterable type, I don't use type-hinting. I check if it's an array first, then re-load the iterator:

    public function foo($bar) {
        if (is_array($bar)) {
            $bar = new ArrayIterator($bar);
        }
        if (!$bar instanceof Traversable) {
            throw new InvalidArgumentException("Not an Iterator");
        }
    }
    
  6. If it's expecting a filename or directory, just confirm it with is_file:

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

I think that handles most of the cases. If you think of any others, I'll gladly try to answer them...

耳钉梦 2024-10-18 22:30:32

类型检查应该在开发阶段而不是生产阶段进行。因此,适当的语法特征是:

 function xyz($a, $b) {
     assert(is_array($a));
     assert(is_scalar($b));

但是我会尽力避免它,或者最好使用类型强制。 PHP 的动态类型可以很好地适应不同的值。只有少数地方您需要关闭基本语言行为。

Typechecking is something you should do at the development stage, not in production. So the appropriate syntactic feature for that would be:

 function xyz($a, $b) {
     assert(is_array($a));
     assert(is_scalar($b));

However I'll try to avoid it, or use type coercion preferrably. PHP being dynamically typed does quite well adapting to different values. There are only few spots where you want to turndown the basic language behaviour.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文