这一个星期主要需要理解的代码主要是实现这样的一个功能:
业务
分类业务主要包括以下几点:
- 核心信息是
广告
- 将广告按照类目、地区、用户进行了分类
- 广告具有所属类目、所属地区、所属用户以及对应评论特性
- 也可以从类目、地区、用户中获取对应的所有广告信息
核心代码层级构建
- 创建一个单例,管理数据库的连接(DataConnection)
- 根据表结构,创建一个共同的父类(Data),一个父类对象对应每个表中的特定行(table、key),这个父类提供主键查询(load),字段查询(find)功能。另外一点技巧是根据PHP动态创建属性的特性,创建一个数组属性,供外界传入各自拥有的字段映射(关联数组)
- 数据库中的部分表中存在父子节点关系,所以创建一个管理父子节点的子类(Tree),提供常用的树操作:查询子节点(children)、查询父节点(parent)、查询父族(getTree)
- 各个不同的表创建一个子类,并根据不同的字段,在构造时传入不同的
初始值
和需要动态创建的属性及对应的查询字段
核心代码剖析
PHP部分基础语法
变量:
PHP是类型松散语言,会根据右边的数值决定左边的类型.
1 | $color $符号表示变量 |
数组:
1 | // 创建数组 |
字符串的基本运算:
1 | . 串接 |
clone对象复制(新对象):
对对象内的基本数值类型进行传值复制,对对象内对象型的成员变量,如果不重写__clone函数,显示clone这个对象成员变量,那么这个成员变量就是进行引用复制,不是生成一个新的对象
继承使用extends。
this、self、parent为分别指向当前对象、当前类、父类的指针。
数据连接单例
1 | class DataConnection { |
共同父类Data
1 | class Data { |
因为一个Data对象对应着数据库中的一行数据,所以需要有以下对应的属性:
- table ->对应的表
- key ->对应行主键
- columns ->对应每个表中各自的私有字段
并且其中涉及到了PHP动态创建属性
的特性。
动态创建的属性默认是public的,要想动态创建私有的属性,可以这么做:
1 | class foo { |
使用一个private的数组,每次创建时可以往这个数组里面添加元素。
__set当给不可访问或不存在属性赋值时被使用。
__get当读取不可访问或不存在的属性时被调用。
可以在以上函数中设置错误抛出,当访问不存在属性时就抛出错误。
isset是在参数为null或者属性不存在时返回false,否则返回true。
其中有两个数据库的函数,我纠结了挺久,是关于执行SELECT返回的数据行数。
- mysql_affected_rows()
- Retrieves the number of rows from a result set. This command is only valid for statements like SELECT or SHOW that return an actual result set.
- mysql_num_rows()
- Get the number of affected rows by the last INSERT, UPDATE, REPLACE or DELETE query associated with link_identifier.
但是实际使用的时候,两者返回的值是一样的,个人感觉和手册上面说的有点不一样。最后在stackoverflow问了下,得出以下结论:
- mysql_affected_rows()返回查询到的数据行数
- mysql_num_rows()返回实际返回的数据行数(结果集中)
详细的讨论在这里:mysql_affected_rows()和mysql_num_rows()
管理树操作子类Tree
1 | class Tree extends Data { |
php实现面向对象的编程方式可以使用两种方式:
clone
方式,这样不管实际类是哪种,都可以拷贝一个全新的对象出来。这种方式在这个上下文下需要对clone的类的部分属性进行清空。- 使用另一种方式,即以上方式:通过
get_class
获取类名,然后重新创建一个。
详细子类
1 | class Category extends Tree { |
这几个子类将自身的属性和数据库中的字段进行了映射,这样外部操作就可以脱离数据库了,只需要和模型交互即可。
主页界面构建
1 |
|
添加
添加功能是后面新增的,主要需要有两点:
- 界面上需要一个输入框和一个确认键,确认后提交评论
- 提交的评论存入数据库
这个功能主要分成两部分:界面,数据库
- 界面使用PHP的表单来进行数据传输
- 数据库插入在Data类中添加一个无参,返回值为false/数据主键的方法
具体代码如下:
界面代码:
1 | // 从POST中获取评论数据 |
数据库插入代码:
1 | // 插入数据 |