0

PHP 将无法实例化对象视为整个应用程序的致命错误(无法捕获),这让我非常恼火。我有一组对我的应用程序运行不是绝对必要的类——它们真的很方便。我有一个工厂对象,它试图实例化配置文件中指示的类变体。

此机制正在部署用于消息存储,并将支持多种存储类型:

  • DatabaseMessageStore
  • FileMessageStore
  • MemcachedMessageStore
  • 等等

一个MessageStoreFactory类将从配置文件中读取应用程序的首选项,实例化并返回相应类的实例。

在实例化周围添加一个条件可能很容易,以确保class_exists(),但MemcachedMessageStore扩展了 PHP 的Memcached类。因此,class_exists()如果没有安装 PHP 的 memcached 绑定,测试将会成功——尽管实例化会失败。

有没有其他方法可以测试一个类是否可以正确实例化?如果不能,我需要做的就是告诉用户哪些功能对他们不可用,但让他们继续使用该应用程序。

4

3 回答 3

0

如果你使用自动加载来加载你的类文件(你应该这样做),如果请求的类仍然不能用于实例化,你可以在自动加载函数的末尾抛出一个自定义异常。这应该在任何时候使用不存在的类时触发,即使对于 PHP 内部类也是如此。所以它应该在你的情况下触发。

于 2010-06-10T12:38:42.947 回答
0

如果您的问题是捕获您的致命错误,您应该尝试编写自己的错误处理程序并根据错误消息采取相应措施。这样您就可以解决 Memcache 的遗留问题。

于 2010-06-10T13:40:24.727 回答
0

As far as I can tell, this can't be done short of PHP 5.3. What I did instead was to make the factory class check for the existence of Memcached before instantiating the class that extends it. It's clumsy and far too brittle for my tastes, but it's working for now. When we upgrade to 5.3, I'll rework it a bit.

于 2010-06-11T22:55:37.740 回答