用对象调用静态方法是不好的实践吗?

4
我发现在某些情况下,通过对象调用静态方法非常方便。
我想知道这是否被认为是一种不好的实践?
或者这个特性将在未来的PHP版本中被移除?
class Foo
{
    public static function bar ()
    {
        echo 'hi';
    }
}

class SubFoo extends Foo
{
    public static function bar ()
    {
        echo 'hi subfoo';
    }
}

// The normal way to call a static method.
Foo::bar(); // => "hi"

// Call the static method via instance.
$foo = new Foo;
$foo::bar(); // => "hi"


// Here is the use case I found calling static method via instance is convenient.
function callbar(Foo $foo) 
{
  // The type-hinting `Foo` can be any subclass of `Foo`
  // so I have to figure out the class name of `$foo` by calling `get_class`.
  $className = get_class($foo);
  $className::bar();

  // Instead of the above, I can just do `$foo::bar();`
}

callbar(new SubFoo); // => "hi subfoo"

2
你也可以将你的函数设置为非静态的,在你的 callbar 函数中使用 Foo 进行类型提示,然后只需调用 $foo->bar(); 即可。 - Daan
@Daan 是的,你可以将所有的静态方法转换为实例方法,这意味着我们根本不需要静态方法。显然,这是一个非常糟糕的想法。我们使用“static”关键字是因为我们希望让用户知道我们正在调用不依赖于个别实例对象的方法。这就是为什么引入了静态关键字的原因。 - yaquawa
1个回答

4
作为一般规则,使用静态方法是不好的实践,因为:
  1. 事实上,静态方法或静态变量是全局变量
  2. 静态代码会在测试中引起许多麻烦
  3. 静态代码使得代码部分之间高度耦合
  4. 静态代码使得代码部分之间存在隐藏的依赖关系
但是,在某些情况下使用静态代码是有道理的。例如:
  1. 方法是针对类而不是对象的
  2. 帮助程序或Util类没有它们自己的状态

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