【发布时间】:2013-02-19 23:31:32
【问题描述】:
我的应用程序中有一个 SystemInfoFactory 类,它有一个 getSystemInfo() 方法:
/**
* Returns SystemInfo object based on which OS
* server uses
*
* @return SystemInfoInterface SystemInfo object
*/
public function getSystemInfo()
{
$os = $this->getOS();
$systemInfo = null;
switch ($os) {
case "Linux":
$systemInfo = new LinuxInfo();
break;
case "Darwin":
$systemInfo = new OSXInfo();
break;
case "Windows":
$systemInfo = new WindowsInfo();
break;
}
return $systemInfo;
}
所以它会根据主机系统选择合适的对象。现在,每个“信息类”都实现了SystemInfo 接口(getArchitecture、getCPU 等方法),但是如您所见,我的代码中没有任何地方检查返回的对象是否真的实现了接口。在返回之前检查选定的 $systemInfo 对象是否实现它是否被认为是“好习惯”?这显然不是必需的,但如果有人扩展了这个应用程序(例如添加了 BSD 支持)并忘记实现所有方法,他可能更难以调试。
【问题讨论】:
-
当有人使用接口但没有实现所有方法时,PHP不应该抛出错误吗??
-
会的,但事实是,他可以只实现所有接口方法,而无需在他的类中显式定义
implements SystemInfoInterface,代码将毫无问题地运行。 -
目前,他可能只是忘记实现其中一种方法,应用程序会在某个时候抛出
undefined method错误,但真正的问题根源可能深埋在调用堆栈中。 -
是的,这是 PHP 动态类型的问题。不知道如何解决。