0

私はPHPでオーバーロードを使用していますが、やりたいことは次のとおりです。オブジェクトを呼び出すと、次のようになります。

$obj->person->name->function();

そのために、__get関数と__call関数を使用します。それらは次のようになります。

function __get($field){
    return $this;
}

ただし、personとnameの変数名はいつでも変更される可能性があるため、知りたいです。私はこのようにしようとしました:

function __get($field){
    $array[] = $field;
    return new object($array);
}

それらは保存されますが、別の行を追加すると、それが配列に追加されるだけです。関数が呼び出された後はクリーンアップされません。__callで配列を空にしようとしましたが、役に立ちませんでした。これをグーグルしたかったのですが、今のところ..運が悪いです。

PHPにこれのためのネイティブ関数はありますか?

-読むには多すぎますか?ここでやめて、残りはただもっと説明です-

ただし、__ callは配列を送信し、実際の関数を処理する別のクラスに送信します。

理由: mongoDBクラスに慣れている5人のプログラマーがいて、大規模なコードベースをMongoDBから別のDBに変更しています。この修正により、代わりにクエリを作成する手間をかけずに、コードベースのDB全体を一度に変更できるようになります。関数クラスでクエリを実行するだけです。(__callが呼び出されたときにアクセスします)。ただし、今日のDBクエリの一般的な行は次のようになります。

$this->db->accounts->update(<array>);

この回線は1つのデータベースに接続し、そのデータベース内でアカウントに接続します。ただし、$coreなどの「特別な」変数がいくつかあります。次のようになります。

$this->db->core->accounts->update(<array>);

それは同じデータベースに接続しません。

必要なのは、オブジェクト内に動的なオブジェクトのラインを構築できるようにすることです。名前が何であるかを見つける必要があるので、これらをクエリに入れることができます。すべてではなく、1行のみ。基本的に、キーベースのデータベース上のドキュメントベースのインフラストラクチャであり、多くのハッキングがあります。:-D

本当にありがとう!

4

1 に答える 1

0

プロパティにアクセスしている間は、別のオブジェクトを返す必要があります。

class TempObj{
  public $table;

  public $db;

  public function __call($name,$arguments){
    switch($name){
      case "update":
        $this->db->query("UPDATE ......");
      break;
    }
  }
}

あなたのDBクラスで

public function __get($name){
  $obj = new TempObj;
  $obj->table = $name;
  $obj->db =& $this;
  return $obj;
}

このようにすると、このオーバーロードされたプロパティのメソッドを$this->db->accounts処理できるオブジェクトが返されます。__call

于 2012-05-24T03:15:54.043 に答える