我在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();
实现这一目标的最简单方法是什么? 任何建议和想法都是适用的。 谢谢!
答案 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());
}