代码之家  ›  专栏  ›  技术社区  ›  Maik Lowrey

函数接受Laravel集合对象,尽管只允许使用字符串

  •  0
  • Maik Lowrey  · 技术社区  · 3 年前

    我刚刚遇到一个问题,我无法解释为什么这样做有效。

    我有一个函数,它只接受字符串类型的参数。

    示例类

    class A {
    
        public function __construct() {
            $data = new \Illuminate\Support\Collection(); 
            // getType($data) => object
            $this->make($data);
        }
    
        private function make(string $str): string {
            // getType($str) => string
            ...
        }
    }
    

    问题: 为什么即使只允许字符串,我也可以传递集合?

    1 回复  |  直到 3 年前
        1
  •  2
  •   Ramy Herrira    3 年前

    根据 docs ,php将尝试转换它:

    默认情况下,如果可能的话,PHP会将错误类型的值强制到期望的标量类型声明中。例如,为期望字符串的参数给定int的函数将获得字符串类型的变量。

    但是如果你重新运行你的代码 declare(strict_types=1); ,你会得到 TypeError 消息

        2
  •  1
  •   Max Pattern    3 年前

    为了避免这种行为,您可以在PHP类的顶部添加: declare(strict_types=1);

        3
  •  1
  •   Oskar Mikael    3 年前

    根据定义,空集合是一个空数组。然后,由于PHP的 类型杂耍 。这意味着,在比较不同类型的变量时,PHP将首先将它们转换为一个通用的、可比较的类型,在这种情况下,它将把数组转换为字符串。

    这也可以通过类型转换变量来避免。

    您可以在PHP文档中找到更多信息 https://www.php.net/manual/en/language.types.type-juggling.php