2011-09-16 44 views
2

我工作的一些遗留代码的时刻和跨一个奇怪的类/函数调用似乎php.net并没有解释迷迷糊糊,我以前从来没见过:PHP函数类方法混乱

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

有一个类的安全性,在这个类里面有一些名为instance和check_client的函数。但是,这似乎在一个陈述中称为两个函数,并将其传递给另一个,或者至少这就是结果所暗示的。 有人能为我澄清这一个吗?

+0

的[static关键字(HTTP: //php.net/manual/en/language.oop5.static.php)(用于静态函数)在[PHP Manual](http://php.net/manual/en/language.oop5.static .PHP)。 – hakre

回答

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(); 
+0

嗨Alfwed,非常感谢你的详细解释。 – Marius

3

执行是这样的:

  • 第一,执行security类的static methodinstance()
  • 它返回(最有可能的)的security类的实例
  • 然后,该check_client方法在返回的对象上执行

因此,由于security::instance()是一个对象,你可以调用它的方法。

+0

你怎么知道它返回一个安全类的实例? :) – hakre

+0

这只是一个猜测,根据OPs声明,代码中存在一个'check_client'方法 – naivists

1

安全:实例()

是一个静态调用(所以可能是一个静态方法)

http://php.net/manual/en/language.oop5.static.php

它返回一些类的实例,其具有构件方法check_client ()

所以它返回一个对象,然后你可以调用该对象的任何公共方法。

0

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

首先,所有函数都可以返回对象。然后调用一个对象函数返回的对象:

security::instance()->check_client() 

是一样的,如:

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

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