15

PHPでこれを行うにはどうすればよいですか

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

私が意味したのはネストされたメソッドまたはネストされたクラス(わかりません!)なので、ユーザーの子としてlimitメソッドを呼び出すと、「users」メソッドまたはクラスから呼び出していることがわかります。制限メソッド-またはクラス!-コメントからそれも知っています。

PHPクラスがこのことを行うための可能な構造は何ですか?


この質問の理由は、私がデータベース用の独自のクラスに取り組んでいるため、このようなものを簡単に使用できるためです。

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

SQLコードを生成するには「id>3制限10のコメントから*を選択してください」ありがとう

4

3 に答える 3

20

説明されているメソッドを使用してメソッドがオブジェクトを返すようにすると、目的のオブジェクトが得られます。

したがって、 -method$DBを持つオブジェクトである限り、その部分は有効です。-methodを持つオブジェクトが返されるcomments()場合、その部分も有効です。次に、 -メソッドを持つオブジェクトを返す必要があります。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は、現在アクティブなオブジェクトを指す「魔法の」変数です。名前が示すように、メソッドの戻り値としてそれ自体を返すだけです。

于 2009-02-10T18:06:30.960 に答える
10

これの標準的な規則は、各メソッド呼び出しの最後に$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();
于 2009-02-10T18:04:45.083 に答える
0

開始するための実装が簡単な方法は、次のようになります。

class db
{
  public function __call($function, $arguments)
  {
    switch($function) {
      // implement table handling here
      case 'user':
        //do something
        return $something;
        break;
    }
  }
}

複雑でしっかりしたものにするか、シンプルで柔軟性の低いものにするかによって、2 つの異なる戦略を実装できます。簡単な戦略は次のようになります。

class db
{

  protected $operatingTable;

  public function limit($limitNumber)
  {
    return $this->executeQuery("SELECT * FROM ".$this->operatingTable." LIMIT ".$limitNumber); // where executeQuery is a function that runs a query
  }

  public function __call($function, $arguments)
  {
    switch($function) {
      // implement table handling here
      case 'user':
        $this->operatingTable='user'; // alternately, but less secure: $this->operatingTable=$function;
        return $this;
        break;
    }
  }
}

代わりに、しかしより強力な:

class db
{
  protected $operatingTable;

  public function limit($limitNumber)
  {
    return $this->executeQuery("SELECT * FROM ".$this->operatingTable." LIMIT ".$limitNumber); // where executeQuery is a function that runs a query
  }

  public function __call($function, $arguments)
  {
    switch($function) {
      // implement table handling here
      case 'user':
        $user = new user($this); // pass in the database to the object, so the table object can have a reference to the db
        return $user;
        break;
    }
  }
}

class baseTableClass
{
  protected $db; // an instance of class db

  function limit($limitNumber)
  {
    $db->execute($aStatementDerivedFromThisClassesInformation); // execute a sql command, based on information about the table in the class
  }

}

class user extends baseTableClass
{
  public function __construct($db) {
    $this->db = $db;
  }
}

あなたはアイデアを得る。db オブジェクトをオーバーロードするか、ベース db オブジェクトとテーブル オブジェクトを作成して、テーブル オブジェクトにインテリジェンスの多くを配置し、作成時にテーブル オブジェクトが db オブジェクトへの参照を格納するようにします。

于 2009-02-10T18:33:15.577 に答える