作者:王永星2012 | 来源:互联网 | 2013-09-13 09:05
利用 oop 与 mysql扩展 完成一个数据库操作类:
新建一个 DB.class.php
设计属性:
设计getRow();
优化 用户输入的 select语句, 如果用户的select语句中 没有limited字句的话 我们手动增加limit 1 字句。
我们需要判断出来 用户的select语句中,是否有limit。判断字符串$query中 是否存在limit?
使用 函数strpos()函数去做,这个函数的返回值,如果存在返回位置,否则返回false,这样判断这个函数如果返回的是false的话,就说明没有limit
通过完成上面的代码,我们发现,凡是需要数据库操作,都需要使用 mysql_query()函数,而且通常都需要 判断是否执行成功。 因此会在执行sql语句时,会有重复性工作,因此应该将重复性代码抽取。
需要定义一个 专门执行sql的方法,如果执行失败 脚本停止运行,并输出错误信息。
在需要执行的地方 调用这个方法。
单独的类文件
通常情况下,我们都将类的定义 写到一个 专门的文件中,通常文件名的命名方式
类名.class.php 的形式
这样 在需要使用这个类时, 需要将类的定义文件引入当前脚本内。
注意:类的定义不能重复,因此在引入外部类文件时,应该注意不能重复引入,否则。。
可以使用 require_once解决。
#p#面向对象编程-自动加载#e#
自动加载:
当 我们的项目是大部分甚至完全 按照面向对象思想编写的话,意味着会出现很多的类,很多的类文件。
每当在实例对象时,都需要引入类文件。
自动加载就为了解决每次都要引入类文件的问题:
会变成 所有的类 统一加载,而不是实例化时分别加载。
利用php提供的自动加载函数 :__autoload() 完成。
这个函数 会在 脚本需要某个类的定义,但是页面内并没有找到类的定义时,会被自动地调用。同时 在调用时,会将当前需要的类名作为参数,传递到__autoload()这个函数内:每次需要都会执行,因此 ,我们得到一个机会(时机),通过这个函数的执行 ,通过类名去将对应的类文件加载进来即可
注意:
如果要保证自动加载能够完成,意味着我们能够想办法 通过类名 得到 类的文件名。
#p#php面向对象编程-类常量#e#
类常量:
定义在类中的常量
定义:
Const 常量名 = 常量值。
定义好的常量 是不会出现类实例化对象内的:
调用:
不能像普通属性一样去访问这个常量:
因为类常量是保存在 类空间的。不能使用对象去访问,应该使用 类去访问。
如果我们需要使用 类 去访问 类空间的内容,不能使用 –> 这个操作符, 应该使用 :: 这个操作符。 :: 范围解析操作符。
注意 类常量只能被类访问,换句话说,只要能够找到相关类,就可以访问到类的常量。
:: 的区别:
-> 针对 对象 操作。
:: 针对 类 操作
通常 如果数据保存在 对象空间,则应该使用 对象访问,反之 如果保存在 类空间,就应该使用 类去访问。 但是 方法比较特殊,是永远保存在类中。方法是既可以使用 对象去访问,也可以使用类去访问。
如果是在类的内部 需要调用当前类的常量的话,此时 可以使用 self 来代替当前的类。
Self $this的区别?
Self 代表类
$this 代表对象。
#p#php面向对象编程-静态方法和静态属性#e#
静态成员:
静态属性 和 静态方法
静态属性 和 静态方法,所谓静态,指的是 在定义是,我们制定属性或者方法为静态的,属性和方法是属于类的。
静态属性:
定义:
定义静态成员 只比非静态成员增加了一个static关键字
访问:由于保存在类空间 因此应该使用 类名访问
访问类空间的内容 不需要实例化对象的。因为声明了一个类 就会有一个类空间。
静态方法:
定义:
访问:
例子:
制作一个对象计数器,每当实例化一个对象 这个计数器的值 +1 ,这个计数器 保存的是当前类所实例化的对象的个数。
找到一个可以保存计数的容器:静态属性
找到修改计数的时机:构造方法
测试的结果:
使用对象可以访问非静态属性,但是不可以访问静态属性。
对测试的静态方法和非静态方法的测试:
结果显示,无论使用对象或者是类都可以静态和非静态方法。
究竟类调用方法 和 对象调用方法有什么区别?
区别 仅仅 在 $this 上。
$this 是在类的方法内,代表当前的对象的。
如果是使用 对象来调用 方法,那么会自动地(隐式地)将当前对象传递到方法内,并且使用$this来引用当前的对象。
如果是使用 类 去调用方法,就不能为方法内的$this赋值。
什么样的方法可以被类调用?
方法内是否使用了 $this.
究竟静态方法和非静态方法有什么区别?
静态方法 在定义时 就规定这个方法应该被类访问,因此 即使我们使用对象去调用这个方法,也不能将当前对象传递到这个方法内。
而非静态方法,是可以在使用对象调用时 将当前对象作为参数传递到方法内的,在方法内可以使用$this来引用当前调用这个方法的对象。