2009-10-20 4 views
2

J'ai deux classes dans une application PHP, B extension A par exemple. classe A a une fonction qui renvoie une partie de ses autres propriétés sous la forme d'un tableau de requêtes d'insertion SQL par exemplePHP extension des propriétés de classe

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

Je voudrais la classe B d'avoir une fonction similaire (identique) qui fait la même chose pour les propriétés de la classe B, tout en conservant les valeurs de la classe A. l'idée étant que chaque requête sera transmise par une dernière fonction en même temps à savoir:

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

si tous OK mysqli- $> commettras() ;

Quel serait le moyen le plus simple d'y parvenir? Des conseils et des idées appreicated. Merci!

Répondre

4

Dans B :: requêtes() vous pouvez appeler la mise en œuvre de parent de cette méthode et ajoutez vos données au tableau un :: requêtes() retourne.

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

Mais vous pouvez (aussi) regarder dans une bibliothèque ORM comme par exemple doctrine.

+0

+1 Doctrine rocks! –

+0

Merci, Encore une question. Est-il possible d'étendre ce processus encore plus loin? par exemple pour avoir une classe C qui peut accéder à sa fonction parente ainsi que la fonction parente de son parent? Espérons que cela a du sens lol – Dan

+1

c :: queries() appelle son implémentation parente (B :: queries()) qui appelle ses parents implémentation (A :: queries()). A :: queries() retourne un tableau, B :: queries() ajoute ses éléments et retourne le tableau, C :: queries() ajoute ses éléments et retourne le tableau. Cela peut durer éternellement si vous aimez ;-) – VolkerK

0

Utilisez une fonction getter pour saisir les propriétés dans les requêtes(). Dans chaque classe, vous pouvez ensuite contrôler les valeurs utilisées par la fonction de requêtes.

0

Vous ne pouvez pas vraiment transférer des données d'une instance à une autre sans initialiser la nouvelle classe avec les informations de l'autre instance. Ainsi, vous pouvez étendre A à modifier le contenu de la fonction de requête de B, puis initialiser B avec une Une instance:

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

Si A et B sont 100% le même (y compris la fonction de requête), tout clone A: $ a = nouveau A(); $ b = clone $ a; Donc vous voulez utiliser les propriétés dans la classe A et la classe B?

0

vous pouvez le faire en utilisant parent. en classe B:

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

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

Vous ne pouvez pas utiliser la propriété parent :: $ pour obtenir les valeurs de propriété sur une instance d'une classe. Vous pouvez le faire avec des classes statiques, mais il est peu probable que cela conduise au résultat souhaité. –

+0

ce n'est pas ce que je fais du tout. J'appelle une méthode parente, pas une valeur. – GSto

Questions connexes