使用类的实例访问静态方法是否被视为不良做法


Is using an instance of a class to access static methods considered bad practice?

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

$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();

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