2012-03-25 15 views
0

die Frage ist einfach. Ich habe eine abstrakte Basisklasse (Person). Daraus habe ich eine weitere Klasse (Patienten) erweitert.php verhindern Eltern Zugriff auf untergeordnete Eigenschaften

Ich speichere persönliche Informationen (z. B. Vorname, Nachname) in PERSONS-Tabelle [es gibt eine ADD-Funktion. ]. Patientenspezifische Informationen (wie Krankheit, Medikamente, ...) werden in einer separaten PATIENTEN-Klasse gespeichert. [Es gibt eine ADD-Funktion, die den Elternteil aufruft, dann etwas Code].

Wie kann ich verhindern, dass die Funktion zum Hinzufügen von Personen auf Eigenschaften zugreift, die im Kind definiert sind, Patienten?

Um es deutlicher zu machen, hier ist ein Beispielcode:

class P { 
public P_var = 'Anoush' ; 
public function add() 
{ 
    // find all properties: 
    foreach ($this as $prop => $val) 
    { 
    $insertables [$prop] = $val ; 
    } 
    // insert all VALUES FIELDSET etc. based on the array created above 

} 

class CH extends P { 
public CH_var1 = 'ravan' ; 
public CH_var2 = 'something' ; 
} 

Dann, wenn ich hinzufügen, nennen, die $insertables enthält P_var, CH_var1, CH_var2. Ich möchte nur, dass es P_var hat.

Dank

+0

Wenn Patienteneigenschaften nicht "public" sind, kann die Elternklasse sie nicht sehen –

+0

In dieser Situation kann ich das 'person' Objekt verwenden Nur –

+0

Sie müssen mehr Code posten, damit wir Ihre Klassenimplementierungen sehen können .. Die untergeordneten Klassen geben keine zusätzlichen Informationen an die übergeordneten Klassen zurück d Wenn der Elternteil "abstrakt" ist, kann er nicht selbst instanziiert werden. –

Antwort

1

Sie können dies tun, indem Reflexion (siehe http://www.php.net/manual/en/book.reflection.php).

class Parent { 
    public function add() { 
     $insertables = $this->_getOwnProperties(__CLASS__); 
     // ... 
    } 

    protected function _getOwnProperties($className) { 
     $reflection = new ReflectionClass($this); 
     $props = array(); 

     foreach ($reflection->getProperties() as $name => $prop) { 
      if ($prop->class == $className) { 
       $props[$name] = $prop; 
      } 
     } 

     return $props; 
    } 
} 

Allerdings empfehle ich Refactoring stattdessen Code eine sauberere Lösung (zB fügen Sie eine Methode getProperties() (vielleicht durch eine Schnittstelle) oder was auch immer definiert zu erhalten. Dann lassen Sie Ihre Datenbank-Klasse diese Funktion berufen, um die Liste zu bekommen Eigenschaften, die in der Datenbank gespeichert werden sollen

+0

Vielen Dank. Ich arbeite daran. –

+0

Können Sie näher erläutern, wo soll ich das hinstellen? eine Funktion innerhalb der abstrakten Elternklasse? –

+0

Ich habe den Code in meiner Antwort aktualisiert! – Niko

Verwandte Themen