如何做一个PHP嵌套类或嵌套方法?

2022-08-31 00:42:00

如何在PHP中执行此操作

$myDBClass->users()->limit(5);//output you limited users to 5
$myDBClass->comments()->limit(3);//output you limited comments to 3

我的意思是嵌套方法或嵌套类(我不知道!)所以当我调用limit方法作为用户的子级时,它会知道我是从“users”方法或class调用它时,当我调用limit方法或class!-从注释中也知道这一点。

PHP类执行此操作的可能结构是什么?


这个问题的原因是因为我正在为数据库开发自己的类,所以我可以很容易地使用这样的东西

     $DB->comments()->id(" > 3")->limit(10);

生成sql代码“从注释中选择*,其中id>3限制10”谢谢


答案 1

让方法返回具有所述方法的对象,然后您就会得到您想要的东西。

因此,只要对象具有 -method,该部分就是有效的。如果返回具有 -method 的对象,则该部分也是有效的。然后,需要返回具有 -method 的对象。$DBcomments()comments()id()id()limit()

在您的特定情况下,您可能希望执行以下操作:

class DB {
  public function comments() {
    // do preparations that make the object select the "comments"-table...
    return $this;
  }

  public function id($string) {
    // handle this too...
    return $this;
  }

  public function limit($int) {
    // also this
    return $this;
  }

  public function execute() {
    $success = try_to_execute_accumulated_db_commands();
    return $success;
  }
}

$DB = new DB();
$DB->comments()->id(" > 3")->limit(10);

在我的示例中,每个方法(此处也未描述)都将返回对象本身,以便可以将命令链接在一起。完成数据库查询的构造后,您实际上通过调用(在我的情况下)将返回一个表示数据库执行成功的布尔值来评估查询。execute()

用户nickohm建议这被称为流利的界面。我必须承认,这对我来说是一个新术语,但这可能告诉我更多的知识,而不是这个术语的用法。(“我只是写代码,你知道的...”)

注意:是指向当前活动对象的“魔术”变量。顾名思义,它只是将自身作为方法的返回值返回。$this


答案 2

这样做的标准约定是在每次方法调用结束时返回$this的实例。因此,当返回到调用方时,我们只是引用另一个方法调用。

class Foo
{
  public function do_something()
  { 
    return $this; 
  }

 public function do_something_else() 
 {
   return $this; 
  }
}

$foo = new Foo();
$foo->do_something()->do_something_else();

推荐