Frage

Ich bin neu in PHP oop Zeug.

Ich versuche Klasse-Datenbank zu erstellen und andere Klassen von nennen. Bin ich es richtig tun?

Klasse Datenbank:

class database extends mysqli {

private $classes = array();

public function __construct() {
parent::__construct('localhost', 'root', 'password', 'database');
    if (mysqli_connect_error()) {
    $this->error(mysqli_connect_errno(), mysqli_connect_error());
    }
}

public function __call($class, $args) {
    if (!isset($this->classes[$class])) {
    $class = 'db_'.$class;
    $this->classes[$class] = new $class(); 
    }
return $this->classes[$class];
}

private function error($eNo, $eMsg) {
die ('MySQL error: ('.$eNo.': '.$eMsg);
}

}

Klasse db_users:

class db_users extends database {

public function test() {
echo 'foo';
}

}

und wie verwende ich es

$db = new database();
$db->users()->test();

Ist es der richtige Weg, oder sollte es eine andere Art und Weise getan werden?

Danke.

War es hilfreich?

Lösung

Sie können es auf diese Weise, da mit, dass nichts falsch ist (ich etwas ähnliches ziemlich oft). Das einzige, was ich vorschlagen würde, ist Ausnahmen statt Würfel mit (auf diese Weise Sie sicher den Fehler umgehen kann) ...

protected function error($eNo, $eMsg, $extra = '') {
    throw new Exception('MySQL error: ['.$eNo.'] '.$eMsg.': '.$extra);
}

Plus, ich würde vorschlagen, dass auch die Abfragemethode Überlastung

public function query($sql, $result_mode = MYSQLI_STORE_RESULT) {
    $result = parent::query($sql, $result_mode);
    if ($result === false) {
         $this->error($this->errno, $this->errstr, $sql);
    }
    return $result;
}

Ich würde auch innerhalb des Kindes Klasse eine Kopie des $ db-Objekts zu speichern vorschlagen. Also:

class db_users extends database {
    protected $db = null;

    public function __construct(Database $db) {
        $this->db = $db;
    }

    public function test() {
        echo 'foo';
    }
}

Dann in __call:

if (!isset($this->classes[$class])) {
    $class = 'db_'.$class;
    $this->classes[$class] = new $class($this); 
}

Andere Tipps

Es ist nichts falsch mit diesem Werk Stil für die Klassen zu schaffen. Ich würde ein bisschen Ausnahmebehandlung darin platzieren.

Meine einzige andere Sorge ist, die sich Datenbank in Unterklassen.

So würde ich wie folgt ändern:

public function __call($className, $args) {
    if (!isset($this->classes[$class])) {
        if(include_once('db_'.$class)) {
            $class = 'db_'.$class;
            $this->classes[$class] = new $class($this);
        } else {
            throw new Exception("Db class not found");
        }
    }

    return $this->classes[$class];
}

Und der Benutzer Klasse wie:

public class db_users {
    private $db;

    public __constructor($db) {
        $this->db = $db;
    }

    public function test() {
        return 'Foo';
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top