J'essaie de créer une classe de base ... un petit cadre si vous voulez, juste pour m'entraîner.
Donc je commence par l'exemple de la classe enfant parce qu'elle a moins de code ! !!
class User extends Base {
public $id ;
public $username ;
public $email ;
public $password ;
function __construct(){
$this->table_name = 'users';
$this->set_cols(get_class_vars('User'));
}
}
$u = new User;
$u->username = 'jason';
$u->email = 'j@gmail.com';
$u->insert();
Voici ma classe de base
class Base {
protected $table_name ;
protected $table_columns ;
protected function set_cols($cols){
unset($cols['table_name']);
unset($cols['table_columns']);
$this->table_columns = array_keys($cols);
}
public function insert(){
$colums = $values = array();
foreach($this->table_columns as $col )
{
if(!$this->$col) continue ;
$values[] = $this->$col ;
$colums[] = $col ;
}
$values = implode(',' , $values);
$colums = implode(',' , $colums);
echo $sql = "INSTER INTO ".$this->table_name ." ($colums)
VALUES ($values) ";
}
}
Voici le problème, je veux faire filter
o get
(essentiellement la lecture de la base de données) statique, puis renvoie un tableau d'objets à partir des données de la base de données.
class Base{
static function filter($conditions =array()){
$query_condition = $conditions ; // some function to convert array to sql string
$query_result = "SELECT * FROM ".$this->table_name ." WHERE $query_condition ";
$export = array();
$class = get_called_class();
foreach($query_result as $q )
{
$obj = new $class;
foreach($this->table_columns as $col )
$obj->$col = $q[$col];
$export[] = $obj;
}
return $export;
}
}
$users = User::filter(['username'=>'jason' , 'email'=>'j@gmail.com']);
Voici le problème, avec filter
en tant que fonction statique __construct
en User
ne sera pas appelée et la classe table_columns
, table_name
sera vide
également dans le filter
je ne peux pas y accéder de toute façon car ils ne sont pas statiques ... Je peux créer une méthode factice User
dans le filter
et résoudre ce problème, mais d'une certaine manière, ça ne semble pas correct.
En fait, j'ai un problème de conception. Toute suggestion est la bienvenue.