2006-10-04

PHP怪现象[5]

这次要说的是PHP5中的一种叫做type hinting(类型暗示)的东西,从使用上来说,接近于Java这类静态类型的类型检查,比如:

<?
interface A{
function a();
}
class AA implements A{
public function a(){
print "A";
}
}
function b(A $a){
$a->a();
}
?>

如果现在运行b(new AA());则会顺利通过,输出一个A,而使用任何其他类型的,比如b(new stdClass());b(1);b("a");之类的,都会出现这种错误:Fatal error: Argument 1 passed to b() must implement interface A, called in ....
应该说,这东西确实给OOP中的类型检测带来了福音,我们无须写if(xx instanceof xxx)这类繁琐的判断语句了。不过,这功能也有点鸡肋的嫌疑。原因有三:

  1. PHP是动态类型的,又是弱类型的,这种type hinting只是虚拟机层次上的动态类型判断,即不能做到编译时提前检查出一些类型错误,也不能给予性能上的极大的提升,
  2. 无法处理基本类型,如string, int——如果将这些东西应用在这个位置上(不过PHP5.1开始array也可以,真是很奇怪),PHP会检查有没有叫做string、int的类或接口;而同样具有type hinting的perl 6,则作的相对更好,比如Perl 6中至少可以将type hinting应用于基本类型上
  3. 不能进行函数重载,如果实现了的话,PHP可能就变成Generic Programming了,但对于PHP这种动态语言来说,这并不是必要的,但现在又具备了type hinting,为何却不能根据类型来进行一些推断(type inference)呢?

没有评论: