我正在努力做一个基础课程,如果你只是为了练习,那么这个小框架

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

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-oop模型基类设计:静态和非静态数据访问的更多相关文章

  1. 在Xcode 4中构建与Objective-c应用程序一起使用的静态C lib

    最好的祝福,吉米解决方法JimmyKoerting在评论中提供了正确的答案:应用程序需要与libstdc.dylib链接以解析标准库符号.感谢JimmyKoerting,但还有一件我想添加的内容是,如果您在iOS6.1中使用xcode最新版本,请添加此libstdc.6.dylib

  2. ios – 如何从故事板中创建的静态UITableView中删除单元格

    解决方法你不能真正处理这个数据源,因为使用静态表,你甚至没有实现数据源方法.高度是走的路.尝试这个:更新看来,在autolayout下,这可能不是最好的解决方案.有一个替代答案here可能有帮助.

  3. ios – 两个类,回调和单元测试

    而且,我不觉得这样的行为会很容易测试?

  4. ios – 在分组的表视图中混合静态和动态部分

    可能需要保持静电细胞的强大性能?在表视图的相同.xib文件中直接设计每个静态单元格,并为它们设置插座是否更好?(虽然这不允许重用我的自定义单元格设计…

  5. ios – OS X:将.dylib转换为.a / .o(动态到静态)?

    假设我已经阅读了thiscaveat,我仍然希望将TBB用作静态链接库.但我真的不想重写TBBmakefile来生成libtbb.a而不是libtbb.dylib.是否有一个简单的命令行方式将libtbb.dylib转换为libtbb.o并使用相同的入口点?

  6. xcode – Swift Constants文件 – 类还是结构?

    我想在我的Swift项目中创建一个Constants文件–填充静态let字符串.我应该创建一个结构还是一个类?

  7. ios – 如何将静态单元格拖入tableView swift?

    我在storyBoard中有一个tableView,我在其中添加了4个静态单元格,我的storyBoard看起来像:我没有这个tableView的任何dataSource,因为我的单元格是静态的.我使用下面的代码拖动一个单元格,它工作正常,直到我滚动一个表格.拖动后滚动它看起来像:正如你所看到的那样,细胞不再出现了.我想拖放静态单元格,我想保存它的位置,所以当我滚动时我不会再重新排列.Sample

  8. ios – 示例代码中AVFoundation.Framework中的静态void指针

    我正在浏览AVFoundation.Framework的示例代码–>AVSimpleEditoriOS&我发现以下一行我无法理解.考虑以下在上面的两行中,我可以看出那些是2个静态的void/generic指针,带有一些奇特的名字.现在回到这两行,我再次粘贴在这里,上面的意思是,2个静态void/generic指针存储它自己的&为什么它需要在什么意义上?我只需要很少的指导来学习这种编码模式.等待知识

  9. ios – Static Cells在Interface Builder中显示为空(运行XCode 7.1)

    解决方法终于找到了一个解决方法,因为这仍然发生在Xcode7.2Beta中:在InterfaceBuilder中,选择ViewController并在属性检查器中将其模拟大小设置为“Freeform”,然后切换到大小检查器并设置适合整个内容的高度.说实话,这比滚动更好.猜猜这将成为我在IB中静态表视图的默认设置.版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  10. 第七章:table单元格的选择和UIAlertController

    运行app,自己试试选择cell更多关于UIAlertController再继续研究之前,我们需要更多的了解一下UIAlertController。UIAlertController是在iOS8引入用来替代UIAlertView和UIActionSheet的。参照上面的代码片段,我们可以指定UIAlertController的preferredStyle。创建好动作后可以使用addAction将动作和UIAlertController连接起来。这就是使用UIAlertController的方法。

随机推荐

  1. PHP个人网站架设连环讲(一)

    先下一个OmnihttpdProffesinalV2.06,装上就有PHP4beta3可以用了。PHP4给我们带来一个简单的方法,就是使用SESSION(会话)级变量。但是如果不是PHP4又该怎么办?我们可以假设某人在15分钟以内对你的网页的请求都不属于一个新的人次,这样你可以做个计数的过程存在INC里,在每一个页面引用,访客第一次进入时将访问时间送到cookie里。以后每个页面被访问时都检查cookie上次访问时间值。

  2. PHP函数学习之PHP函数点评

    PHP函数使用说明,应用举例,精简点评,希望对您学习php有所帮助

  3. ecshop2.7.3 在php5.4下的各种错误问题处理

    将方法内的函数,分拆为2个部分。这个和gd库没有一点关系,是ecshop程序的问题。会出现这种问题,不外乎就是当前会员的session或者程序对cookie的处理存在漏洞。进过本地测试,includes\modules\integrates\ecshop.php这个整合自身会员的类中没有重写integrate.php中的check_cookie()方法导致,验证cookie时返回的username为空,丢失了登录状态,在ecshop.php中重写了此方法就可以了。把他加到ecshop.php的最后面去就可

  4. NT IIS下用ODBC连接数据库

    $connection=intodbc_connect建立数据库连接,$query_string="查询记录的条件"如:$query_string="select*fromtable"用$cur=intodbc_exec检索数据库,将记录集放入$cur变量中。再用while{$var1=odbc_result;$var2=odbc_result;...}读取odbc_exec()返回的数据集$cur。最后是odbc_close关闭数据库的连接。odbc_result()函数是取当前记录的指定字段值。

  5. PHP使用JpGraph绘制折线图操作示例【附源码下载】

    这篇文章主要介绍了PHP使用JpGraph绘制折线图操作,结合实例形式分析了php使用JpGraph的相关操作技巧与注意事项,并附带源码供读者下载参考,需要的朋友可以参考下

  6. zen_cart实现支付前生成订单的方法

    这篇文章主要介绍了zen_cart实现支付前生成订单的方法,结合实例形式详细分析了zen_cart支付前生成订单的具体步骤与相关实现技巧,需要的朋友可以参考下

  7. Thinkphp5框架实现获取数据库数据到视图的方法

    这篇文章主要介绍了Thinkphp5框架实现获取数据库数据到视图的方法,涉及thinkPHP5数据库配置、读取、模型操作及视图调用相关操作技巧,需要的朋友可以参考下

  8. PHP+jquery+CSS制作头像登录窗(仿QQ登陆)

    本篇文章介绍了PHP结合jQ和CSS制作头像登录窗(仿QQ登陆),实现了类似QQ的登陆界面,很有参考价值,有需要的朋友可以了解一下。

  9. 基于win2003虚拟机中apache服务器的访问

    下面小编就为大家带来一篇基于win2003虚拟机中apache服务器的访问。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  10. Yii2中组件的注册与创建方法

    这篇文章主要介绍了Yii2之组件的注册与创建的实现方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下

返回
顶部