我工作的一些遗留代码的时刻和跨一个奇怪的类/函数调用似乎php.net并没有解释迷迷糊糊,我以前从来没见过:PHP函数类方法混乱
if(security::instance()->check_client()) {
有一个类的安全性,在这个类里面有一些名为instance和check_client的函数。但是,这似乎在一个陈述中称为两个函数,并将其传递给另一个,或者至少这就是结果所暗示的。 有人能为我澄清这一个吗?
我工作的一些遗留代码的时刻和跨一个奇怪的类/函数调用似乎php.net并没有解释迷迷糊糊,我以前从来没见过:PHP函数类方法混乱
if(security::instance()->check_client()) {
有一个类的安全性,在这个类里面有一些名为instance和check_client的函数。但是,这似乎在一个陈述中称为两个函数,并将其传递给另一个,或者至少这就是结果所暗示的。 有人能为我澄清这一个吗?
这是一个经典的实施singleton pattern
我想你security
类看起来是这样的:
class security {
private static $instance = null;
private function __construct() {}
public static function instance() {
if (null === self::$instance)
self::$instance = new security();
return self::$instance;
}
public function check_client() { /* do something */ }
}
它所做的是静态方法实例返回类安全的一个实例;这意味着security::instance() instanceof security === true
这就是为什么你可以链调用check_client()方法,在你的为例
security::instance()->check_client()
这类似于
$secu = security::instance();
$secu->check_client();
嗨Alfwed,非常感谢你的详细解释。 – Marius
执行是这样的:
security
类的static methodinstance()
security
类的实例check_client
方法在返回的对象上执行因此,由于security::instance()
是一个对象,你可以调用它的方法。
安全:实例()
是一个静态调用(所以可能是一个静态方法)
http://php.net/manual/en/language.oop5.static.php
它返回一些类的实例,其具有构件方法check_client ()
所以它返回一个对象,然后你可以调用该对象的任何公共方法。
我只能假设(因为我不知道底层代码),但它可能会解释给你。
首先,所有函数都可以返回对象。然后调用一个对象函数返回的对象:
security::instance()->check_client()
是一样的,如:
$securityInstance = security::instance();
$securityInstance->check_client();
下一步,通过的instance
命名我会假设一个的security::instance()
返回实例安全类,可能是单例实现或基于应用程序配置的工厂。
的[static关键字(HTTP: //php.net/manual/en/language.oop5.static.php)(用于静态函数)在[PHP Manual](http://php.net/manual/en/language.oop5.static .PHP)。 – hakre