是否可以在 PHP 中创建静态类(如 C #) ?

我想在 PHP 中创建一个静态类,让它像 C # 中一样工作,所以

  1. 构造函数在对该类的第一次调用时自动调用
  2. 不需要实例化

诸如此类的..。

static class Hello {
private static $greeting = 'Hello';


private __construct() {
$greeting .= ' There!';
}


public static greet(){
echo $greeting;
}
}


Hello::greet(); // Hello There!
123452 次浏览

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

因此,您必须创建一个 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!




?>

您可以拥有那些类似于“静态”的类。但是我认为,有些真正重要的东西缺失了: 在 php 中你没有应用程序周期,所以你不会得到一个真正的静态(或单例)在你的整个应用程序..。

PHP 中的单例

final Class B{


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

B 的结构称为单元处理程序,也可以在

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

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

对象不能静态定义 但这个可以

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

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

所以在我看来,这是一个基于格雷格的更完整的例子:

<?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!




?>

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

这样构造函数和析构函数就可以正常工作,如果我愿意,我可以创建额外的非静态实例(例如第二个 DB 连接)

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

另一个好处是,您可以忽略调用事物的顺序,因为一切都将按需设置。

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