我正在努力做一个基础课程,如果你只是为了练习,那么这个小框架
所以我从小孩类的例子开始,因为它有更少的代码!
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();
这是我的基础课
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) "; } }
这里是问题,我想做过滤或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'=>'j@gmail.com']);
这里是问题,使用filter作为静态函数__construct在User类中不会被调用和table_columns,table_name将为空
也是在过滤方法我无法访问他们,因为它们不是静态的…我可以在过滤器方法中创建一个虚拟的用户对象,并解决这个问题,但不知何故它不觉得正确
基本上我有一个设计问题,任何建议是受欢迎的
问题是静态对象在静态运行时并不真正被“创建”.
如果您希望构造函数运行,但仍然以静态方式运行,则需要“单例”.这是创建对象的地方,然后可以重新使用.您可以以静态和非静态方式混合此技术(因为您实际上正在创建一个可以共享的“全局”对象).
一个例子
class Singleton { private static $instance; public static function getInstance() { if (null === static::$instance) { self::$instance = new static(); } return self::$instance; } } $obj = Singleton::getInstance();
每次这样得到相同的实例,并从之前记住状态.
如果您希望尽可能少地更改代码库,您可以静态创建一个“初始化”变量 – 您只需要记住在每个功能中调用它.虽然听起来不错,但它甚至比Singleton更糟糕,因为它仍然记住状态,每次需要记住init.但是,您可以使用静态和非静态调用混合使用.
class notASingletonHonest { private static $initialized = false; private static function initialize() { if (!self::$initialized) { self::$initialized = true; // Run construction stuff... } } public static function functionA() { self::$initialize(); // Do stuff } public static function functionB() { self::$initialize(); // Do other stuff } }
但是,在结算之前,请先阅读一下.第一个比第二个更好,但即使这样,如果你使用它,确保你的单身班可以在任何时候真正地运行,而不依赖于以前的状态.
因为两个类都记住状态,有许多代码纯粹主义者警告你不要使用单例.您本质上是创建一个全局变量,无需任何控制即可被操纵. (免责声明 – 我使用单身人士,我使用工作所需的任何技术的混合物.)
Google“PHP Singleton”提供了一系列意见和更多的例子,哪里/哪里不使用它们.