Questo è ciò che ho: Tutti gli oggetti che possono essere mantenuti sul database estendono la classe astratta DatabaseObject, che ha tutto il codice logico per controllare effettivamente le modifiche degli attributi ed eseguire le query dei database.Come sovrascrivere una proprietà statica di un oggetto padre e consentire all'oggetto padre di accedere al nuovo valore in PHP?
Sto usando due variabili statiche per definire dettagli specifici dell'oggetto. Li definisco genericamente nella classe base, e quindi presumibilmente li sovrascrivo negli oggetti di database reali.
Il problema è: quando il codice nella classe padre viene effettivamente eseguito, utilizza il valore padre precedente anziché il valore dell'oggetto corrente.
Ecco il codice per la classe di base:
abstract class DatabaseObject {
public $id;
private static $databaseTable = NULL;
private static $databaseFields = array();
private $data = array();
private $changedFields = array();
public function IDatabaseObject($id) {
$this->id = $id;
$this->data = Database::GetSingle(self::$databaseTable, $id);
Utils::copyToObject($this, $this->data, self::$databaseFields);
}
public static function Load($id) {
return new self($userID);
}
public static function Create($data) {
$id = Database::Insert(self::$databaseTable, $data);
return new self($id);
}
public function Save() {
$data = Utils::copyFromObject($this, $this->changedFields);
Database::Update(self::$databaseTable, $data, $this->id);
}
public function __constructor() {
// We do this to allow __get and __set to be called on public vars
foreach(self::$databaseFields as $field) {
unset($this->$field);
}
}
public function __get($variableName) {
return $this->$variableName;
}
public function __set($variableName, $variableValue) {
// We only want to update what has been changed
if(!in_array($variableName, $this->changedFields) && in_array($variableName, self::$databaseFields)) {
array_push($this->changedFields, $variableName);
}
$this->$variableName = $variableValue;
}
}
Ed ecco il codice per uno degli oggetti che si estendono la classe di base di cui sopra:
class Client extends DatabaseObject {
public static $databaseTable = "clients";
public static $databaseFields = array("name","contactName","primaryUserID","email","is_active","rg","cpf","cnpj","ie","addrType","addrName","addrNumber","addrComplement","addrPostalCode","addrNeighborhood","addrCity","addrState","addrCountry","phoneLandline","phoneFax","phoneMobile");
public $name;
public $contactName;
public $primaryUserID;
public $email;
public $is_active;
public $rg;
public $cpf;
public $cnpj;
public $ie;
public $addrType;
public $addrName;
public $addrNumber;
public $addrComplement;
public $addrPostalCode;
public $addrNeighborhood;
public $addrCity;
public $addrState;
public $addrCountry;
public $phoneLandline;
public $phoneFax;
public $phoneMobile;
public static function Load($id) {
return new Client($id);
}
}
Che cosa sto facendo male qui? C'è un altro modo per ottenere lo stesso risultato?
Un breve addendum: dichiaro gli attributi nel corpo della classe principalmente per consentire che venga visualizzato dalla funzione di completamento automatico di NetBeans.
possibile duplicato di [ereditarietà di classe in PHP 5.2: sostituzione di variabili statiche nella classe di estensione?] (Http://stackoverflow.com/questions/3017777/class-inheritance-in -php-5-2-overriding-static-variable-in-extension-class) – outis
Questa è una domanda legittima in php, che ha un'implementazione piuttosto confusa, ma la domanda potrebbe davvero essere ristretta per renderla più generica e accessibile per le altre persone di beneficiare. –