php-oop模型基类设计:静态和非静态数据访问

前端之家收集整理的这篇文章主要介绍了php-oop模型基类设计:静态和非静态数据访问前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在努力做一个基础课程,如果你只是为了练习,那么这个小框架

所以我从小孩类的例子开始,因为它有更少的代码

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”提供了一系列意见和更多的例子,哪里/哪里不使用它们.

猜你在找的PHP相关文章