是否可以在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对Master
和Customer
都使用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];
}
}
我希望这能帮助其他人。我花了几个小时调试发生了什么。