在PHP中,是否可以将类的实例声明为属性?
基本上我想要实现的是:
abstract class ClassA()
{
static $property = new ClassB();
}
好的,我知道我不能这样做,但除了总是像这样做有没有其他解决方法:
if (!isset(ClassA::$property)) ClassA::$property = new ClassB();
在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();
?>
这篇文章有些年头了,但我最近遇到了一个问题,我有一个基类。
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使用GeneralObject::$_instance
来处理Master
和Customer
。
我能够实现想要的唯一方法是将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];
}
}