2

我在 PHP 应用程序中有两个类,例如 B 扩展 A。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 类有一个类似(相同)的函数,它对 B 类的属性做同样的事情,同时仍然保持 A 类的值。这个想法是每个查询都将同时通过一个最终函数IE:

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

如果一切正常 $mysqli->commit();

实现这一目标的最简单方法是什么?任何建议和想法appreicated。谢谢!

4

4 回答 4

4

在 B::queries() 中,您可以调用parent的该方法的实现并将您的数据附加到数组 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";
}

但是您可能(也)想研究一个 ORM 库,例如学说

于 2009-10-20T21:19:42.177 回答
0

使用 getter 函数来获取 query() 中的属性。然后,您可以在每个类中控制查询函数使用的值。

于 2009-10-20T21:13:48.653 回答
0

如果不使用另一个实例的信息初始化较新的类,您就不能真正将东西从一个实例转移到另一个实例。所以你可以扩展 A 来改变 B 的查询函数内容,然后用 A 实例初始化 B:

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 回答