Domanda

Sono nuovo di roba OOP di PHP.

Sto cercando di creare un database di classe e chiamare altre classi da esso. Sto facendo nel modo giusto?

database di classe:

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

}

db_users classe:

class db_users extends database {

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

}

e come lo sto usando

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

E 'il modo giusto o dovrebbe essere fatto in un altro modo?

Grazie.

È stato utile?

Soluzione

Si può fare in questo modo, non c'è niente di sbagliato in questo (faccio qualcosa di simile molto spesso). L'unica cosa che vorrei suggerire è usare le eccezioni, invece di morire (in questo modo è possibile gestire in modo sicuro l'errore) ...

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

Inoltre, io suggerirei di sovraccaricare il metodo di query, nonché

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

Vorrei anche suggerire memorizzare una copia dell'oggetto $ db all'interno della classe figlio. Quindi:

class db_users extends database {
    protected $db = null;

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

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

Poi, in __call:

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

Altri suggerimenti

Non c'è niente di sbagliato in questo stile fabbrica per la creazione di classi. Avevo posto un po 'di gestione delle eccezioni in esso.

La mia unica altra preoccupazione sta estendendo base di dati nelle classi secondarie.

Così mi piacerebbe Modificare come segue:

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

E la classe utenti come:

public class db_users {
    private $db;

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

    public function test() {
        return 'Foo';
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top