Search code examples
phpclassmysqliextend

PHP extending class properties


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!


Solution

  • 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.