PHP函数类方法混淆

时间:2011-09-16 09:21:51

标签: php class function

我正在研究一些遗留代码,偶然发现一个奇怪的类/函数调用,php.net似乎没有解释,我以前从未见过:

if(security::instance()->check_client()) {

有一个类安全性,该类中有一些名为instance和check_client的函数。但这似乎在一个陈述中将两个函数称为另一个,或者至少将结果表示为一个。 有人可以为我澄清这个吗?

4 个答案:

答案 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)

这是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();

答案 3 :(得分:0)

我只能假设(因为我不知道底层代码),但它可能会向你解释。

首先,函数可以返回对象。然后,在返回的对象上调用对象函数:

security::instance()->check_client()

是一样的:

$securityInstance = security::instance();
$securityInstance->check_client();

接下来,通过instance的命名,我会假设security::instance()返回安全类的实例,可能是单例实现或基于应用程序配置的工厂。