有关PHP的链式调用

我在使用PHP链式调用时遇到了一个问题:
下面有一个类“Site”:

<?php
class Site{
public function api(){
require('class.Api.php');
$this->api = new Api();
return $this->api;
}
}
?>

位于“class.Api.php”中还有一个类“Api”:

<?php
class Api{
public function auth(){
//quiet a few
}
public function render(){
//quiet a few
}
}
?>

用下面代码实例化:

$site = new Site();

再调用下列代码:

$site->api()->auth();
$site->api()->render();

请问php会重复require()和创建新对象Api吗?如果是,require()可以用require_once()替代,但是该如何使“$site->api()”返回同一个对象呢?谢谢!

阅读 3.7k
5 个回答

PHP的单例模式可以很好解答你的疑问。

class Api
{
    public function auth(){
        //quiet a few
        var_dump(222);
    }
    public function render(){
        //quiet a few
    }
}

class Site{
    static private $_api;

    public function api(){
        if(self::$_api != NULL) {
            var_dump(1);
            return self::$_api;
        }else {
            var_dump(2);
            self::$_api = new Api();
            return self::$_api;
        }
        
    }
}

$site = new Site();
echo $site->api()->auth();
echo $site->api()->render();

以上会输出:

E:\WWW\test\test.php:21:int 2
E:\WWW\test\test.php:6:int 222
E:\WWW\test\test.php:18:int 1

说明第一次调用auth()进了api()else执行语句,第二次调用render()进入if语句,说明返回的是同一个实例。

不管你调用多少次,返回的都是一个实例,这就是单例模式

单例模式。

<?php
class Site{
    
    public function api(){
        if (!isset($this->api)) {
            $this->api = new Api();
        }
        return $this->api;
    }
}
?>

只是简单写写,还需要很多优化。

require('class.Api.php');
class Site{
    protected $api;
    
    public function getApi()
    {
        return $this->api;
    }
    
    public function api(){
        $this->api = new Api();
    }
}
?>
$site = new Site();
$site->api();
$site->getApi()->auth();
$site->getApi()->render();

你这代码, 肯定报错. 类重复定义.

$this->api // 这个api最好先声明下吧。。

protected $api;//然后再调用
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题