如何找出一个方法是从OOP中的链(方法链接)调用的

时间:2014-05-13 21:04:24

标签: php oop

有没有办法找出一个从链调用的方法?

例如:

<?php 
...
class db
{

function query($sql) 
  {
  //do query
  return $this;
  }

}

在上面的代码中,如何从类 db 确保query()方法是否在链中?

$obj = new db();
$obj->dosth()->query();

$obj = new db();
$obj->query();

2 个答案:

答案 0 :(得分:1)

你不能,即使可以,也可能不想。

你不能

无法确定某个方法是稍后在链中调用还是强制调用者这样做。此外,PHP没有任何允许您在某些点自动执行代码的机制或结构(例如C ++中的RAII或C#中的using)。

你可能不想

流畅的界面的一大优势是它们是可组合的:

$query = $db->doSth();
foo($query);

function foo($query)
{
    $query->doSthElse()->query();
}

如果您以某种方式强迫用户在语句末尾调用query,则通用函数foo可能不存在。

另见

您可能还会发现my answerHow 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");

在两个调用中都有完全相同的调试信息(当然除了调用函数的行)