在纯静态类中禁止构造函数是好做法吗?


Is it good practice to forbid constructor in static-only class?

在我正在开发的应用程序中,有一些只有静态函数的类。

这些类不遵循单例模式。把它们当作"工具"。

非真实示例:

class MathHelper {
    public static function plus($num1, $num2)
    {
        return $num1 + $num2;
    }
}

禁止使用…的构造是好做法吗?

    private function __construct()
    {
    }

只是为了防止这样的类被实例化?

可以将类定义为抽象类,以防止实例化。

abstract class MathHelper {
    public static function plus($num1, $num2)
    {
        return $num1 + $num2;
    }
}
echo MathHelper::plus(1,2); // 3
$math = new MathHelper(); // Fatal error: Cannot instantiate abstract class MathHelper

声明构造函数为private,不定义函数。《effective c++》一书的第6条谈到了这一点。

class MathHelper {
public:
    static function plus($num1, $num2)
    {
    return $num1 + $num2;
    }
private:
    MathHelper ();
}

就像@ian-brindley回答的那样,你可以通过声明你的类abstract来防止实例化,但如果你也想将该类声明为final,你可以省略abstract并在构造函数中抛出异常:

<?php
final class MyClass
{
  public function __construct()
  {
    throw new 'Exception();
  }
}