【问题标题】:PHP Functions Classes Methods ConfusionPHP 函数 类 方法 混乱
【发布时间】:2011-09-16 09:21:51
【问题描述】:

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

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

有一个安全类,该类中有名为 instance 和 check_client 的函数。但这似乎在一个语句中调用了两个函数并将一个传递给另一个,或者至少这就是结果所暗示的。 有人可以帮我澄清一下吗?

【问题讨论】:

标签: php class function


【解决方案1】:

执行如下:

  • 首先,执行security类的static methodinstance()
  • 它返回security 类的实例(很可能)
  • 然后,在返回的对象上执行check_client方法

所以,既然security::instance() 是一个对象,你可以在它上面调用一个方法。

【讨论】:

  • 你怎么知道它返回了一个安全类的实例? :)
  • 这只是一个猜测,基于 OP 声明代码中存在方法 check_client
【解决方案2】:

这是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,非常感谢您的详尽解释。
【解决方案3】:

security:instance()

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

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

返回某个类的实例,该实例有一个成员方法check_client()

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

【讨论】:

    【解决方案4】:

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

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

    security::instance()->check_client()
    

    同理:

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

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

    【讨论】:

      猜你喜欢
      • 2018-08-11
      • 2014-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-13
      • 2018-10-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多