I have two classes in a PHP application, B extending A for example. Class A has a function which returns some of its other properties in the form of an array of SQL insert queries eg
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";
}
}
I would like class B to have a similar (identical) function which does the same thing for class B's properties, whilst still maintaining the values from class A. The idea being that each query will be passed through a final function all at the same time ie:
$mysqli->query("START TRANSACTION");
foreach($queries as $query) {
if(!$mysqli($query)) {
$mysqli->rollback();
}
}
IF all OK $mysqli->commit();
What would be the simplest way to achieve this? Any advice and ideas appreicated. Thanks!
Within B::queries() you can call the parent's implementation of that method and append your data to the array a::queries() returns.
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";
}
But you might (also) want to look into an ORM library like e.g. doctrine.