Я пытаюсь сделать базовый класс... крошечной структурой, если вы просто собираетесь практиковать
Итак, я начинаю с примера дочернего класса, потому что у него меньше кода!
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 = '[email protected]';
$u->insert();
Вот мой базовый класс
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) ";
}
}
Вот проблема, я хочу сделать статический метод filter
или get
(в основном, чтение из базы данных), а затем вернуть массив объектов из данных базы данных
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'=>'[email protected]']);
Вот проблема: filter
как статическая функция __construct
в User
класс не будет вызван, а table_columns
, table_name
будет пустым
также в методе filter
я не могу получить к ним доступ в любом случае, потому что они не являются статическими... Я могу создать объект User
в качестве макета User
в методе filter
и решить эти проблемы, но так или иначе чувствовать себя правильно
В принципе у меня есть проблема с дизайном, любое предложение приветствуется