使用类的实例来访问静态方法是否被认为是不良实践?

5
使用类的实例访问静态方法被认为是不良做法吗?
例如:
$model = new MyClass();
$options = MyClass::getOptions();

对比

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

(无论哪种情况下,$model 都会被实例化,我只想知道哪种方法更好。)


@SiGanteng,IDE没有抱怨,而且它可以运行... - bcmcfc
好的,那是我的错,抱歉。 - Andreas Wong
3个回答

4

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

第二种方法是PHP独有的(据我所知);它之所以有效,是因为::运算符消除了表达式的歧义,而在Java中,一个句点用于实例和静态属性。

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

结论

如果您的实例类型从周围代码中立即清晰可见,那么选择第二个选项可能更容易(有时类名可能非常大);但如果不是,使用第一个选项最为明确。


3
那得看情况而定。使用静态方法可以让你在很多年内愉快地享受无需实例化的代码,但总有一天你需要将一些调用转到另一个子类中,这时候简单的搜索和替换就不行了。因此,我认为使用准备好的对象是更安全的路线。
作为替代方案,您可以使用这样的方法:
$className = 'MyClass';
$className::classyMethod1();
$className::classyMethod2();

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


1

我相信,这个替代方案:

$options = MyClass::getOptions();

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接