使用类的实例访问静态方法是否被认为是不好的做法?
IE
$model = new MyClass();
$options = MyClass::getOptions();
对比
$model = new MyClass();
$options = $model::getOptions();
($model
在任何一种情况下都会被实例化,我只是想知道一种方法是否比另一种更可取。)
传统上,第一种方式(指定类名本身)与其他语言(如 Java)有更多相似之处。
第二个是 PHP 独有的(afaik);它之所以有效,是因为::
运算符消除了表达式的歧义,这与 Java 不同,其中句点同时用于实例和静态属性。
我不确定使用第二个选项对性能的影响是什么,但我认为这取决于个人品味/编码标准。
结论
如果您的实例类型从周围的代码中立即清楚,则选择第二个选项可能更容易(有时类名可能很大);但如果不是,请使用第一个选项,因为它是最明确的。
这取决于,我想。您可以愉快地使用静态方法多年,享受无实例化的代码,但有一天您将不得不将一些(这就是它的去处)调用重新路由到另一个后代类,所以简单的搜索和替换调用不会'不做。) 因此,我认为使用准备好的对象是一条更安全的路线。
作为替代方案,您可以使用以下内容:
$className = 'MyClass';
$className::classyMethod1();
$className::classyMethod2();
...但我想这可能会随着时间的推移变得相当混乱(并且仅在 PHP 5.3+ 中可用)
我相信,这种选择:
$options = MyClass::getOptions();
实际上浪费的内存更少,因为您不需要额外的变量来调用静态函数。