编写自己的ORM,学习PHP5.3.docVIP

  • 2
  • 0
  • 约5.41千字
  • 约 9页
  • 2017-12-22 发布于河南
  • 举报
编写自己的ORM,学习PHP5.3

编写自己的ORM,学习PHP5.3 /sitem/717157ca4542ae0bad092fbd 编写自己的ORM,学习PHP5.3(一) 编写自己的ORM,学习PHP5.3(一) 虽然创建一个PHP的ORM并非是平时常见的任务,但是这是提高自身PHP技能的好方法,如果实现时能采用一些PHP5.3新增的功能,那更是大有益处。现在已经有很多优秀的ORM(对象关系映射)实现,在现实的产品中,采用它们或是更好的选择,这个教程只是通过完成创建一个ORM任务,来学习一下 PHP5.3中的一些新特性。 现在开始 首先我们需要创建一个数据库,后面我们将用ORM访问它。为了保持示例的简单性,我们使用MySQL的示例数据库Sakila,它可以从这里下载。Sakila数据库设计用于DVD出租商店,本文将使用电影和演员数据表,这个数据库的更多信息,你可以从这里获取。这个练习,需要你创建该数据库,并导入相关的数据。 下一个事情就是创建一个访问数据库的方法。本文的目的是创建一个ORM,而不是一个完整的数据库层,所以我们将使用大部分人熟悉的Zend Framework。这个框架已经自带了ORM,即Zend_Db_Table,不过我们不用它,我们仅使用Zend_Db适配器访问数据库。 本文关注的是ORM的实现,而不是完整的MVC应用,所以只需额外创建一个简单的命令行脚本或网页,用于和ORM交互即可。我建议创建如下的目录结构: library/ Zend/ ORM/ tutorial.php Zend目录下需要包含Zend Framework 框架代码(本文例子中用的是1.9.6 ,不过稍低一些的版本也应该可以);ORM目录用于保存自己开发的ORM代码;tutorial.php文件用于运行一些示例代码。开始之前,需要在 tutorial.php中包含如下代码: ?php ini_set(include_path, ini_get(include_path).:./library/); 定义数据层 首先我们需要考虑采用何种方式与数据库通信。在前面已经提过,本文将用Zend_Db访问数据库,然而,我们可以再增加一些抽象,这样方便以后更换数据库层,甚至切换到web service服务。下面为数据查询定义一个接口: ?php namespace ORM\DataSource; interface DataSource { public function find($object, array $criteria = array(), $order = null, $limit = null, $offset = 0); public function count($object, array $criteria = array()); } 目前该接口包含两个方法find和count,它们接受一个对象名(对数据库来讲这可能是表名)和筛选条件。对于find方法,还需要参数指定数据的排序顺序,以及从某个位置开始返回指定条数的记录。 本文中,筛选条件为简单的key/value数组,只能实现精确匹配和有限的通配符功能。这么做可以让下面的例子简明一些,但是如果开发一个用于生产环境的ORM,可能需要采用一个复杂的结构来保存筛选条件。一些ORM(如Zend_Db_Table)可以通过where子句指定筛选条件,绑定参数。这种做法的缺陷就是把代码和数据库平台耦合在一起。 如果你刚接触PHP 5.3,可能已经发现上面的示例代码和以前有些不一样。我们在代码头部增加了一个名字空间ORM\DataSource的声明,它可以避免名字冲突。我们的接口DataSource现在一般不会和其它类产生名字冲突,因为它们在不同命名空间下。引入命名空间后,名字冲突的概率比全部定义在全局空间的时候要少很多。 虽然PHP不要求命名空间和文件系统对应,但是和autoloading中,一个类一个文件一样,可以让系统更加清晰。我们把接口文件保存在application目录下的library/ORM/Datasource/DataSource.php文件中,后面开发的接口和类的文件存放文章与此类似,不在赘述。 现在查询数据的方式已经定义好,那如何向数据库写数据呢?为此定义另外一个接口: ?php namespace ORM\DataSource; interface Modifiable { public function add($object, array $data); public function update($object, array $data); public function remove($object, array $data); } 首先你可能疑惑为什么不把这些方法直

文档评论(0)

1亿VIP精品文档

相关文档