5

使用类的实例访问静态方法是否被认为是不好的做法?

IE

$model = new MyClass();
$options = MyClass::getOptions();

对比

$model = new MyClass();
$options = $model::getOptions();

$model在任何一种情况下都会被实例化,我只是想知道一种方法是否比另一种更可取。)

4

3 回答 3

4

传统上,第一种方式(指定类名本身)与其他语言(如 Java)有更多相似之处。

第二个是 PHP 独有的(afaik);它之所以有效,是因为::运算符消除了表达式的歧义,这与 Java 不同,其中句点同时用于实例和静态属性。

我不确定使用第二个选项对性能的影响是什么,但我认为这取决于个人品味/编码标准。

结论

如果您的实例类型从周围的代码中立即清楚,则选择第二个选项可能更容易(有时类名可能很大);但如果不是,请使用第一个选项,因为它是最明确的。

于 2012-06-15T16:25:34.407 回答
3

这取决于,我想。您可以愉快地使用静态方法多年,享受无实例化的代码,但有一天您将不得不将一些(这就是它的去处)调用重新路由到另一个后代类,所以简单的搜索和替换调用不会'不做。) 因此,我认为使用准备好的对象是一条更安全的路线。

作为替代方案,您可以使用以下内容:

$className = 'MyClass';
$className::classyMethod1();
$className::classyMethod2();

...但我想这可能会随着时间的推移变得相当混乱(并且仅在 PHP 5.3+ 中可用)

于 2012-06-15T16:27:18.330 回答
1

我相信,这种选择:

$options = MyClass::getOptions();

实际上浪费的内存更少,因为您不需要额外的变量来调用静态函数。

于 2012-06-15T16:39:08.680 回答