PHP扩展类属性

时间:2009-10-20 21:04:09

标签: php class mysqli extend

我在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类的值。这个想法是每个查询都将通过一个最终函数传递给所有同时即:

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

如果OK OK $ mysqli-> commit();

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

4 个答案:

答案 0 :(得分: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库,例如doctrine

答案 1 :(得分:0)

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

答案 2 :(得分: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;

答案 3 :(得分:0)

所以你想使用A类和B类的属性? 你可以用父母做到这一点。 在B班:

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

  return array_merge($queries,parent::queries());
}