2

PHP アプリケーションに 2 つのクラスがあります。たとえば、A を拡張する B です。クラス A には、他のプロパティの一部を SQL 挿入クエリの配列の形式で返す関数があります。

Class A {
$property_a;
$property_b;
$property_c;
$property_d;

function queries() {
$queries = array();
$queries[] = "INSERT INTO xxx VALUES " . $this->property_a . ", " . $this->property_b";
$queries[] = "INSERT INTO yyy VALUES " . $this->property_b . ", " . $this->property_d";
}
}

クラス B には、クラス A の値を維持しながら、クラス B のプロパティに対して同じことを行う同様の (同一の) 関数を持たせたいと考えています。すなわち:

$mysqli->query("START TRANSACTION");
foreach($queries as $query) {
if(!$mysqli($query)) {
$mysqli->rollback();
}
}

IF すべて OK $mysqli->commit();

これを達成する最も簡単な方法は何ですか?アドバイスやアイデアを歓迎します。ありがとう!

4

4 に答える 4

4

B::queries() 内で、そのメソッドのの実装を呼び出して、データを a::queries() が返す配列に追加できます。

class B extends A {
  protected $property_e=5;
  public function queries() {
    $queries = parent::queries();
    // In a real application property_e needs to be sanitized/escaped
    // before being mixed into the sql statement.
    $queries[] = "INSERT INTO zzz VALUES " . $this->property_e;
    return $queries;
  }
}
$b = new B;
foreach( $b->queries() as $q ) {
  echo $q, "\n";
}

しかし、(また) doctrineのような ORM ライブラリを調べたいと思うかもしれません。

于 2009-10-20T21:19:42.177 に答える
0

query() でプロパティを取得するには、getter 関数を使用します。その後、各クラスで、クエリ関数が使用する値を制御できます。

于 2009-10-20T21:13:48.653 に答える
0

他のインスタンスの情報で新しいクラスを初期化せずに、あるインスタンスから別のインスタンスに何かを持ち越すことはできません。したがって、A を拡張して B のクエリ関数の内容を変更し、B を A インスタンスで初期化できます。

class A {
    protected $propa = "";
    protected $propb = "";
    //etc

function query { /*...*/ }
}

class B extends A {
    function __construct( A $classA )
    {
        $this->propa = $classA->propa;
        // etc
    }
    function query()
    {
        //B-type queries
    }
}

$A = new A();
// set stuff in a
new B( $A );

A と B が (クエリ関数を含めて) 100% 同じである場合は、A を複製するだけです: $a = new A(); $b = $a のクローン;

于 2009-10-20T21:16:38.580 に答える
0

クラスAとクラスBのプロパティを使用したいですか?親を使用してこれを行うことができます。クラスB:

function queries(){
  $queries = array()
   //stuff to get queries

  return array_merge($queries,parent::queries());
}
于 2009-10-20T21:16:59.403 に答える