有没有办法找出一个从链调用的方法?
例如:
<?php
...
class db
{
function query($sql)
{
//do query
return $this;
}
}
在上面的代码中,如何从类 db 确保query()方法是否在链中?
$obj = new db();
$obj->dosth()->query();
或
$obj = new db();
$obj->query();
答案 0 :(得分:1)
你不能,即使可以,也可能不想。
无法确定某个方法是稍后在链中调用还是强制调用者这样做。此外,PHP没有任何允许您在某些点自动执行代码的机制或结构(例如C ++中的RAII或C#中的using
)。
流畅的界面的一大优势是它们是可组合的:
$query = $db->doSth();
foo($query);
function foo($query)
{
$query->doSthElse()->query();
}
如果您以某种方式强迫用户在语句末尾调用query
,则通用函数foo
可能不存在。
您可能还会发现my answer对How to create a fluent query interface?很有用 - 这里没有任何内容与您在此处未提及的问题直接相关,但“第3步:实现”特别针对此部分进行了处理接口
答案 1 :(得分:0)
没有机会跟踪此方法的调用方式。我也没有看到你应该这样做的任何理由。使用链接方法应该与分别调用2个(或更多)方法完全相同。
我已经使用debug_backtrace检查了它,如上面的代码所示:
<?php
class db
{
function query($sql)
{
$debug = debug_backtrace();
var_dump($debug);
}
function dosth() {
return $this;
}
}
$obj = new db();
$obj->dosth()->query("test");
echo "<br /><br /><br /><br />";
$obj2= new db();
$obj2->query("test2");
在两个调用中都有完全相同的调试信息(当然除了调用函数的行)