我从未见过这样的代码:
public static function getInstance()
{
if ( ! isset(self::$_instance)) {
self::$_instance = new self();
}
return self::$_instance;
}
它和 new className()
是一样的吗?
编辑
如果这个类是继承而来的,它指向哪个类?
我从未见过这样的代码:
public static function getInstance()
{
if ( ! isset(self::$_instance)) {
self::$_instance = new self();
}
return self::$_instance;
}
它和 new className()
是一样的吗?
编辑
如果这个类是继承而来的,它指向哪个类?
self
指向包含它的类。
因此,如果您的getInstance方法在名为MyClass
的类中,那么下面这行代码:
self::$_instance = new self();
将执行与以下相同的操作:
self::$_instance = new MyClass();
编辑:在评论后提供一些额外信息。
如果你有两个继承关系的类,那么会有两种情况:
getInstance
方法定义在子类中getInstance
方法定义在父类中第一种情况可能会像这样(为了本示例中的单例行为我已经删除了所有非必要的代码--你需要添加回来):
class MyParentClass {
}
class MyChildClass extends MyParentClass {
public static function getInstance() {
return new self();
}
}
$a = MyChildClass::getInstance();
var_dump($a);
这里,您将获得:
object(MyChildClass)#1 (0) { }
这意味着 self
指的是 MyChildClass
,也就是它所在的类。
class MyParentClass {
public static function getInstance() {
return new self();
}
}
class MyChildClass extends MyParentClass {
}
$a = MyChildClass::getInstance();
var_dump($a);
您会得到这样的输出:
object(MyParentClass)#1 (0) { }
这意味着self
表示MyParentClass
- 也就是说,在这里,它指的是它所在的类。
static
关键字的新用法:现在可以在我们在这些示例中使用self
的地方使用它:class MyParentClass {
public static function getInstance() {
return new static();
}
}
class MyChildClass extends MyParentClass {
}
$a = MyChildClass::getInstance();
var_dump($a);
但是,使用static
而不是self
,现在您将获得:
object(MyChildClass)#1 (0) { }
意思是static
有些像指向使用的类(我们使用了MyChildClass::getInstance()
),而不是它所在的类。self
的行为--PHP 5.3只添加了一种新行为,回收static
关键字。baseclass
和class
,它指向哪一个? - user198729self
和继承,我提供了更多的信息;而且我还包括了一些有关PHP 5.3中的static
的信息;;希望这可以帮助你 :-) - Pascal MARTIN这似乎是 单例模式 的实现。
该函数以静态方式调用并检查静态类是否设置了变量 $_instance
。
如果没有设置,则初始化自身的一个实例 (new self()
) 并将其存储在 $_instance
中。
如果您调用 className::getInstance()
,则在每次调用时都会获得 同一个 类实例,这是单例模式的目的。
我从未见过这样做,而且老实说我不知道这是可能的。
在类中,$_instance
声明为什么?
$_instance
is declared as public static $_instance;
- Atifprivate static $_instance = NULL;
$this->_instance = 'something';
但它被声明为静态,所以我们不能使用 $this 代码,我们可以使用以下代码替代:
self::$_instance
通过检查静态类变量上是否存储了一个对象,该类可以决定创建或不创建单个实例。因此,如果未设置(!isset),表示在静态成员$_instance上不存在对象,则会生成一个新对象,并将其存储在静态成员 $_instance 中,命令如下:
self::$_instance = new self();
然后将其返回给客户端代码。客户端代码可以愉快地使用该对象的单个实例及其公共方法,但是在客户端代码中,调用单个访问点即getInstance()
方法也很棘手,必须像这样调用
$thisObject = className::getInstance();
这个函数在本质上被声明为静态的。
是的,它就像new className()
(指包含该方法的类),可能用于单例模式,其中构造函数是私有的。