实例作为静态类属性


Instance as a static class property

是否可以在PHP中将类的实例声明为属性?

基本上我想要实现的是:

abstract class ClassA() 
{
  static $property = new ClassB();
}

好吧,我知道我做不到,但除了总是做这样的事情之外,还有什么变通办法吗:

if (!isset(ClassA::$property)) ClassA::$property = new ClassB();

您可以使用类似于单例的实现:

<?php
class ClassA {
    private static $instance;
    public static function getInstance() {
        if (!isset(self::$instance)) {
            self::$instance = new ClassB();
        }
        return self::$instance;
    }
}
?>

然后你可以引用实例:

ClassA::getInstance()->someClassBMethod();

另一种解决方案,静态构造函数,与类似

<?php
abstract class ClassA {
    static $property;
    public static function init() {
        self::$property = new ClassB();
    }
} ClassA::init();
?>

请注意,这个类不必是抽象的就可以工作。

另请参阅如何初始化静态变量和https://stackoverflow.com/a/3313137/118153.

这已经有几年的历史了,但我刚刚遇到一个问题,我有一个基类

class GeneralObject
{
    protected static $_instance;
    public static function getInstance()
    {
        $class = get_called_class();
        if(!isset(self::$_instance))
        {
            self::$_instance = new $class;
        }
        return self::$_instance;
    }
}

有一个儿童类

class Master extends GeneralObject 
{
}

和另一个儿童类

class Customer extends Master 
{
}

但当我尝试呼叫时

$master = Master::getInstance();
$customer = Customer::getInstance();

$master将是预期的Master,但$customer将是Master,因为php对MasterCustomer 都使用GeneralObject::$_instance

我能实现我想要的唯一方法是将GeneralObject::$_instance更改为array并调整getInstance()方法。

class GeneralObject
{
    protected static $_instance = array();
    public static function getInstance()
    {
        $class = get_called_class();
        if(!isset(self::$_instance[$class]))
        {
            self::$_instance[$class] = new $class;
        }
        return self::$_instance[$class];
    }
}

我希望这能帮助其他人。我花了几个小时调试发生了什么。