是否有可能在PHP中创build静态类(如在C#中)?

我想在PHP中创build一个静态类,它的行为就像在C#中一样,所以

  1. 构造函数在第一次调用该类时自动调用
  2. 没有实例化要求

这种东西…

static class Hello { private static $greeting = 'Hello'; private __construct() { $greeting .= ' There!'; } public static greet(){ echo $greeting; } } Hello::greet(); // Hello There! 

你可以在PHP中有静态类,但是他们不会自动调用构造函数(如果你尝试调用self::__construct()你会得到一个错误)。

因此你必须创build一个initialize()函数并在每个方法中调用它:

 <?php class Hello { private static $greeting = 'Hello'; private static $initialized = false; private static function initialize() { if (self::$initialized) return; self::$greeting .= ' There!'; self::$initialized = true; } public static function greet() { self::initialize(); echo self::$greeting; } } Hello::greet(); // Hello There! ?> 

除了Greg的回答之外,我还是build议将构造函数设置为private,这样就不可能实例化类。

所以我认为这是一个更完整的例子,基于Greg的一个例子:

 <?php class Hello { /** * Construct won't be called inside this class and is uncallable from * the outside. This prevents instantiating this class. * This is by purpose, because we want a static class. */ private function __construct() {} private static $greeting = 'Hello'; private static $initialized = false; private static function initialize() { if (self::$initialized) return; self::$greeting .= ' There!'; self::$initialized = true; } public static function greet() { self::initialize(); echo self::$greeting; } } Hello::greet(); // Hello There! ?> 

你可以有那些“静态”的类。 但我想,这是一个真正重要的是缺less的东西:在PHP中,你没有一个应用程序循环,所以你不会得到一个真正的静态(或单身)在整个应用程序…

请参阅PHP中的Singleton

 final Class B{ static $staticVar; static function getA(){ self::$staticVar = New A; } } 

b的结构是一个singeton处理程序,你也可以在a中执行

 Class a{ static $instance; static function getA(...){ if(!isset(self::$staticVar)){ self::$staticVar = New A(...); } return self::$staticVar; } } 

这是单身使用$a = a::getA(...);

我通常更喜欢编写常规非静态类,并使用工厂类来实例化对象的单个(sudo静态)实例。

这种方式构造和析构函数工作正常,我可以创build额外的非静态实例,如果我愿意(例如第二个数据库连接)

我一直使用它,特别适用于创build自定义数据库存储会话处理程序,因为页面终止析构函数会将会话推送到数据库。

另一个好处是你可以忽略你所说的顺序,因为一切都将按需求设置。

 class Factory { static function &getDB ($construct_params = null) { static $instance; if( ! is_object($instance) ) { include_once("clsDB.php"); $instance = new clsDB($construct_params); // constructor will be called } return $instance; } } 

DB类…

 class clsDB { $regular_public_variables = "whatever"; function __construct($construct_params) {...} function __destruct() {...} function getvar() { return $this->regular_public_variables; } } 

任何你想使用它只是打电话…

 $static_instance = &Factory::getDB($somekickoff); 

然后把所有的方法都视为非静态的(因为它们是)

 echo $static_instance->getvar(); 

对象不能静态定义,但是这个工作

 final Class B{ static $var; static function init(){ self::$var = new A(); } B::init();