PHP sınıfı özelliklerini uzanan

3 Cevap php

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";
}
}

Ben hala A sınıfı her sorgu aynı zamanda bir nihai fonksiyonu geçilecek varlık fikri değerlerini korurken, sınıf B özellikleri için aynı şeyi yapar benzer bir (aynı) işleve sahip B sınıfı istiyorum yani:

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

Tüm Tamam $ mysqli-> tamamlama IF ();

What would be the simplest way to achieve this? Any advice and ideas appreicated. Thanks!

3 Cevap

B :: sorgular içinde () bu yöntemi parent 'nin uygulama arayabilir ve dizinin bir :: sorguları () döner için veri eklemek.

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";
}

Ancak (ayrıca) örneğin gibi bir ORM kütüphane içine bakmak isteyebilirsiniz doctrine.

(Sorgularda özelliklerini kapmak için, bir alıcı işlevi kullanın). Her sınıfta o sorguları fonksiyonu kullanarak hangi değerleri kontrol edebilirsiniz.

Gerçekten diğer örneğinin bilgileri ile yeni sınıf başlatılırken olmadan başka bir örneğinden şeyler üzerinde taşıyamaz. Yani o bir A örneği ile B başlatılamıyor, B'nin sorgu işlevi içeriğini değiştirmek için A uzatabilirsiniz:

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 );

If A and B are 100% the same (including query function), just clone A: $a = new A(); $b = clone $a;