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