【问题标题】:PHP singleton patternPHP 单例模式
【发布时间】:2012-06-14 02:35:45
【问题描述】:

您好,我想学习 php 中的单例模式, 我有课:

class Database
{
    private static $instance;

    private function __construct() 
    { 
    }

    public static function getInstance()
    {
        if (!self::$instance)
        {
            self::$instance= new Database();
        }

        return self::$instance;
    }

    public function query($table)
    {
         $this->query = 'select * from $table';
    }

    public function result()
    {
        echo $this->query;

    }

}


$db = Database::getInstance();

现在,是否可以调用 result() 方法并使用单例打印 query() 设置的值,即“select * from $table”?

我希望我的代码类似于:

$db->query('user_tb')->result();

//output
select * from user_tb;

【问题讨论】:

标签: php oop class singleton return


【解决方案1】:

更新:

可以这样称呼它:

$db->query('user_tb')->result();

您需要将return $this; 放入要链接的方法中,在这种情况下是您的query 方法:

public function query($table)
{
     $this->query = "select * from $table";
     return $this;
}

现在你可以这样称呼它:$db->query('user_tb')->result();

Working Example

----------------------------------------------- --------------------------------------------

首先修改你的query()方法:

$this->query = 'select * from $table';

收件人:

$this->query = 'select * from ' . $table;

由于在single quotes内部,变量不被解析。

然后像这样在类级别定义$query

class Database {
  private static $Instance;
  private $query = '';
  // your more code
}

然后你可以运行它来获取它:

$db = Database::getInstance(); // get class instance
$db->query('user_tb'); // set $query var
$db->result(); // get $query var

结果:

select * from user_tb

Working Example

【讨论】:

  • 是的,谢谢,我确实采用了这种方法,但出于某种原因,我想做一系列的编码风格,就像我说的那样,$db->query('user_tb')->result(); //输出 select * from user_tb;
  • 工作示例链接不起作用。请更新它
【解决方案2】:

要使用方法链接,请确保要链接的所有函数都返回 $this。

那你就可以DB::getInstance()->query()->result();.=

所以查询至少需要返回$this。

此外,您放弃了通过返回参数进行的任何错误处理,因此通常如果您使用方法链接,则需要使用异常处理来处理错误。

你不能这样做

if(!$db->query) {
    error_log('bleh');
}

【讨论】:

  • 有没有办法自动返回实例而不在每个方法中返回 $this?
猜你喜欢
  • 2014-12-26
  • 2012-09-25
  • 1970-01-01
  • 1970-01-01
  • 2022-07-26
  • 2011-01-07
  • 1970-01-01
  • 1970-01-01
  • 2012-08-18
相关资源
最近更新 更多