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
{
}
?>
我希望ConcreteClass实例和所有未来的未知用户定义对象也可以被SetObject接受。如何在检查正确类型时允许这样做?
答案 0 :(得分:11)
实际上对于类,您可以在PHP(5 +)中提供类型提示。
<?php
class UsesBaseClass
{
function SetObject(InterfaceObject $obj)
{
}
}
?>
这也可以像你期望的那样正确地继承。
顺便说一句,不要在你的班级名字中加上“对象”这个词......
答案 1 :(得分:4)
作为Eran Galperin响应的补充,您还可以使用类型提示强制参数为数组 - 而不仅仅是某个类的对象。
<?php
class MyCoolClass {
public function passMeAnArray(array $array = array()) {
// do something with the array
}
}
?>
如您所见,您可以键入提示,::passMeAnArray()
方法需要array
,并提供默认值,以防该方法被调用任何参数。
答案 2 :(得分:2)
对于原始类型,您还可以使用is_ *函数:
public function Add($a, $b)
{
if (!is_int($a) || !is_int($b))
throw new InvalidArgumentException();
return $a + $b;
}
答案 3 :(得分:1)
@ Eran Galperin的响应是确保您使用的对象类型正确的首选方法。
另外值得注意的是instanceOf运算符 - 当您想要检查某个对象是多种类型之一时,它会很有用。
答案 4 :(得分:1)
您看,类型提示有多个答案。这是技术解决方案。但是你也应该确保整个设计是合理和直观的。这会使类型问题和错误更加罕见。
请记住,即使这些类型的失败也会在运行时抛出 。确保您已对代码进行测试。
答案 5 :(得分:1)
即使在您描述的情况下,您的脚本也会崩溃,抱怨对象Y上没有方法/属性X,因此您将知道它来自何处。
无论如何,我认为总是试图阻止成长过程的程序员将错误的对象传递给方法并不是一个好时机投资:你可以把它花在记录和培训上。
鸭子打字和细心的同事是你需要的,而不是额外的检查,会让你的应用更加严格。
但它可能是Pythonista的观点......
答案 6 :(得分:0)
您可以在php.ini文件中设置error_reporting ini设置,或使用error_reporting函数在运行时设置它