我正在研究一些遗留代码,偶然发现一个奇怪的类/函数调用,php.net似乎没有解释,我以前从未见过:
if(security::instance()->check_client()) {
有一个类安全性,该类中有一些名为instance和check_client的函数。但这似乎在一个陈述中将两个函数称为另一个,或者至少将结果表示为一个。 有人可以为我澄清这个吗?
答案 0 :(得分:3)
执行如下:
instance()
类的static method security
security
类(最有可能)check_client
方法因此,由于security::instance()
是一个对象,您可以在其上调用一个方法。
答案 1 :(得分:1)
安全:实例()强>
是静态调用(可能是静态方法)
http://php.net/manual/en/language.oop5.static.php
返回某个类的实例,该实例具有成员方法check_client()
所以它返回一个对象,然后你可以调用该对象上的任何公共方法。
答案 2 :(得分:1)
我认为你的班级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();
答案 3 :(得分:0)
我只能假设(因为我不知道底层代码),但它可能会向你解释。
首先,函数可以返回对象。然后,在返回的对象上调用对象函数:
security::instance()->check_client()
是一样的:
$securityInstance = security::instance();
$securityInstance->check_client();
接下来,通过instance
的命名,我会假设security::instance()
返回安全类的实例,可能是单例实现或基于应用程序配置的工厂。