【问题标题】:How do I prevent using the incorrect type in PHP?如何防止在 PHP 中使用不正确的类型?
【发布时间】:2010-09-13 08:00:21
【问题描述】:

众所周知,PHP 的类型非常松散。该语言不要求您为函数参数或类变量指定任何类型的类型。这可能是一个强大的功能。

但有时,它会使调试脚本成为一种痛苦的体验。例如,将一种对象传递给需要另一种对象的方法会产生错误消息,抱怨传递的对象不存在某个变量/方法。这些情况大多是烦恼。更繁重的问题是当您使用错误类的对象初始化一个对象时,并且直到稍后在脚本执行中才会使用“错误对象”。在这种情况下,您最终得到的错误比传递原始参数时要晚得多。

与其抱怨我传递的内容没有特定的方法或变量,或者等到脚本执行的很久以后才能使用我传递的对象,我宁愿有一个错误消息,在我指定错误类型的对象的确切位置,抱怨对象的类型不正确或不兼容。

您如何在代码中处理这些情况?你如何检测不兼容的类型?如何在我的脚本中引入一些类型检查,以便获得更容易理解的错误消息?

另外,在考虑到 PHP 中的继承时,你怎么能做到这一切呢?考虑:

<?php
class InterfaceClass
{
#...
}

class UsesInterfaceClass
{
   function SetObject(&$obj) 
   {
       // What do I put here to make sure that $obj either
       // is of type InterfaceObject or inherits from it       

   }
}
?>

然后这段代码的用户使用他们自己的具体类来实现接口:

<?php

class ConcreteClass extends InterfaceClass
{
}



?>

我希望 SetObject 也可以接受 ConcreteClass 实例以及所有未来未知的用户定义对象。在检查正确的类型时,您如何允许这样做?

【问题讨论】:

    标签: php oop type-safety


    【解决方案1】:

    实际上对于类,您可以在 PHP (5+) 中提供类型提示。

     <?php
     class UsesBaseClass
     {
          function SetObject(InterfaceObject $obj) 
          {
          }
     }
     ?>
    

    这也可以像您期望的那样与继承正常工作。

    顺便说一句,不要在你的类名中加上“对象”这个词...

    【讨论】:

      【解决方案2】:

      作为对 Eran Galperin 响应的补充,您还可以使用类型提示来强制参数为数组 - 而不仅仅是某个类的对象。

      <?php
      class MyCoolClass {
         public function passMeAnArray(array $array = array()) {
            // do something with the array  
         }  
       }  
       ?>
      

      如您所见,您可以输入 ::passMeAnArray() 方法需要 array 的提示,并提供默认值,以防在不带任何参数的情况下调用该方法。

      【讨论】:

        【解决方案3】:

        对于原始类型,您还可以使用 is_* 函数:

        public function Add($a, $b)
        {
          if (!is_int($a) || !is_int($b))
            throw new InvalidArgumentException();
          return $a + $b;
        }
        

        【讨论】:

          【解决方案4】:

          你看,关于类型提示有多个答案。这是技术解决方案。但是你也应该确保整个设计是明智和直观的。这将使类型问题和错误更加罕见。

          请记住,即使是这些类型错误也会在运行时抛出。确保您对代码进行了测试。

          【讨论】:

            【解决方案5】:

            即使在你描述的情况下,你的脚本也会崩溃,抱怨对象 Y 上没有方法/属性 X,所以你会知道这是从哪里来的。

            无论如何,我认为总是试图阻止长大的程序员将错误的对象传递给一个方法并不是一个好的时间投资:你可以把它花在文档和培训上。

            你需要的是鸭式打字和细心的同事,而不是会让你的应用更加死板的额外检查。

            但这可能是 Pythonista 的观点……

            【讨论】:

              【解决方案6】:

              @Eran Galperin 的响应是确保您使用的对象类型正确的首选方法。

              另外值得注意的是instanceOf 运算符 - 当您想要检查一个对象是否是多种类型之一时,它很有帮助。

              【讨论】:

              • instanceof 很有用。请记住不要滥用它。
              【解决方案7】:

              您可以在 php.ini 文件中设置 error_reporting ini 设置或使用 error_reporting 函数在运行时设置它

              【讨论】:

                猜你喜欢
                • 2021-05-07
                • 2012-08-10
                • 2021-12-11
                • 1970-01-01
                • 1970-01-01
                • 2021-02-05
                • 1970-01-01
                • 1970-01-01
                • 2023-02-09
                相关资源
                最近更新 更多