手动调用的语法形式总是这样:parent::构造方法或析构方法()
--------------------------------------------------------------------------------------
覆盖(override):
重写的基本要求:
访问控制权限:
子类覆盖的属性或方法的访问控制权限,不能“低于”父类的被覆盖的属性或方法的访问控制权限:
父类: public 子类:只能是public
父类: protected 子类:可以说protected和public
父类: private 子类:不能覆盖!——既父类的私有成员,不存在被子类覆盖的可能。
方法的参数形式:子类覆盖父类的同名方法的时候,参数要求跟父类保持一致;
--------------------------------------------------------------------------------------
最终类 final
最终类,其实就是一种特殊要求的类:要求该类不允许往下继承下去。
形式:
final class 类名{
//类的成员定义。。。跟一般类的定义一样!
}

最终方法 final
最终方法,就是一个不允许下级类去覆盖的方法!!
形式:
class 类名{
final function 方法名(形参列表...){ 。。。。。 }
}
--------------------------------------------------------------------------------------
工厂模式 单例模式 14.doc
--------------------------------------------------------------------------------------
抽象类:
定义形式:
abstract class 类名{}
--------------------------------------------------------------------------------------
抽象方法:
定义形式:
abstract function 方法名( 形参1,形参2,.... ); //注意,这里必须有分号;
--------------------------------------------------------------------------------------
抽象类和抽象方法的细节
1,一个抽象方法,必须在抽象类中;
2,反过来,抽象类中可以没有抽象方法——虽然不常见;
3,可见:抽象方法是为了规定下级类中“必须”要具体去完整某个工作(任务);
4,下级类中继承了上级类的抽象方法,则要么去“实现该方法的具体内容”,要么自己也作为抽象类(即其继承的抽象方法仍然是抽象的);
5,子类实现父类的抽象方法的时候,其形参也应该跟父类保持一致,其访问权限也不能更小;
——其原因其实这是“重写现象”,自然应该遵循重写的要求;
--------------------------------------------------------------------------------------
重载技术overloading
重载的基本概念
重载在“通常面向对象语言”中的含义:
是指,在一个类(对象)中,有多个名字相同但形参不同的方法的现象;
类似这样:
class C{
function f1(){。。。}
function f1($p1){。。。}
function f1($p1, $p2 ){。。。}
}
$c1 = new C();
$c1->f1();
$c1->f1(2);
$c1->f1(3,4);

重载在“php语言”中的含义:
是指,当对一个对象或类使用其未定义的属性或方法的时候,其中的一些“处理机制”;
比如:
class A{
public $p1 = 1;
}
$a1 = new A();
echo $a1->p1; //1;
echo $a1->p2; //出错,未定义的属性!
则:php中的重载技术,就是来应对上述“出错”的情况,使代码不出错,而且还能“优雅处理”;
--------------------------------------------------------------------------------------
属性重载
就是对一个对象的不存在的属性进行使用的时候,这个类中预先设定好的应对办法(处理机制);
属性,本质,就是变量,其只有4个操作:
取值:当对一个对象的不存在的属性进行“取值”的时候,就会自动调用内部方法:__GET()
赋值:当对一个对象的不存在的属性进行“赋值”的时候,就会自动调用内部方法:__SET()
判断(isset):当对一个对象的不存在的属性进行isset()判断的时候,就会自动调用内部方法:__isset()
销毁(unset):当对一个对象的不存在的属性进行unset()销毁的时候,就会自动调用内部方法:__unset()
--------------------------------------------------------------------------------------
方法重载
当对一个对象的不存在的实例方法进行“调用”的时候,会自动调用类中的__call()这个魔术方法;
当对一个类的不存在的静态方法进行“调用”的时候,会自动调用类中的__callstatic()这个静态魔术方法;
--------------------------------------------------------------------------------------
利用php的重载技术,实现通常的“方法重载”: 15.doc
--------------------------------------------------------------------------------------
接口(interface)定义形式:
interface 接口名{
常量1;
常量2;
.....
抽象方法1;
抽象方法2;
.....
}
说明:
1,可见,接口中,只有常量(接口常量)和抽象方法两种成员;
2,接口常量的使用形式为: 接口名称::常量名称;
3,接口中的抽象方法,不要使用abstract修饰,也不需要使用访问控制修饰符,因为其天然就是public
--------------------------------------------------------------------------------------
接口可以实现“多继承”——但此时不称为继承而已,而是称为“实现”;
即:
接口1 -->> 类1;
就称为:类1实现了接口1;
其本质,其实就是类1中,有了接口1中“特征信息”;
--------------------------------------------------------------------------------------
使用形式:
形式为:
class 类名 implements 接口名1, 接口名2, ....{
//类的定义。
}

其中,接口跟接口之间,也可以继承,跟类之间的继承:
interface 接口1 extends 接口2{
//接口的成员定义;。。。。
}
--------------------------------------------------------------------------------------
类和接口的大总结 15.doc
进一步完善mysqldb工具类: 15.doc
--------------------------------------------------------------------------------------
类的自动加载
条件和要求
1,当需要一个类的时候,就会自动调用某个函数(默认是__autoload),并传入所需要的类的名字
2,一个类应该保存到一个独立的“类文件中”:即其中只有该类的定义,没有别的代码;
3,习惯上,类文件的命名要有一定的“规则”,通常是:类名.class.php
4,通常,我们需要将各种类,存储在一些特定的目录中,以方便确定其位置!
5,在该自动加载的函数中,“充分”使用传过来的类名,以构建一个合适的文件路径并载入;
--------------------------------------------------------------------------------------
自定义自动加载函数:
基本模式为:
spl_autoload_register(“函数1”); //声明“函数1”作为自动加载函数;
spl_autoload_register(“函数2”); //声明“函数2”也作为自动加载函数;
然后,就去定义这些函数,跟定义__autoload()函数一样:
function 函数1( $class_name ){
//.......
}
function 函数2( $class_name ){
//.......
}
--------------------------------------------------------------------------------------
对象的复制(克隆)
语法:$obj2 = clone $obj1; //这样,就有一个跟$obj1完全一样的新的对象。
--------------------------------------------------------------------------------------
对象的遍历
对象的遍历,跟数组的遍历,一样!
其实,只能遍历出对象的“实例属性数据”
foreach( $对象名 as $key => $value){
//这里就可以处理$key和$value
//但注意:
1, $key表示的是对象 的 “属性”,$value是其对应值;
2, 这里能够遍历出来的属性,只能是在该范围中的“可访问属性”(就是要考虑访问控制权限)
}
--------------------------------------------------------------------------------------
其他数据类型转换为对象类型
语法形式为:$obj1 = (object) 其他类型数据;
数组转换为对象:数组的键名当作属性名,值为对应值;
null转换为对象:空对象;$obj1 = (object)null;
其他标量数据转换为对象:属性名为固定的“scalar”,值为该变量的值:
--------------------------------------------------------------------------------------
单例类的加强:禁止克隆
对于一个类的对象,如果使用“clone运算符”,就会克隆出一个跟当前对象完全一样的新对象出来,
并且:此时还会自动调用该类中的魔术方法:_ _c l o n e ();只要其中有该方法;
则,要想实现单例类,就应该对这个单例类的对象“禁止克隆”,做法是:
私有化这个魔术方法:_ _c l o n e ();
--------------------------------------------------------------------------------------
与类有关的其他魔术方法
序列化与反序列化技术
含义:
序列化:就是将一个变量所代表的“内存”数据,转换为“字符串”形式并持久保存在硬盘上的一种做法。
反序列化:就是将序列化之后保存在硬盘上的“字符串数据”,恢复为其原来的内存形式的变量数据的一种做法。

序列化的做法:
$v1 = 123; //这是一个变量,代表任意的内存数据
$s1 = serialize( $v1 ); //将任何类型的变量数据,转换为“字符串”
file_put_contents( ‘要保存的目标文本文件’, $s1); //将该字符串,保存到一个文件里(就是硬盘数据)

反序列化的做法:
$s1 = file_get_contents( ‘保存序列化数据的目标文本文件’); //从一个文件里读出其中的所有字符
$v1 = unserialize( $s1 ); //将该字符串数据,反序列化转换为变量(数据)
--------------------------------------------------------------------------------------
__sleep():用于对象的序列化:
1,对一个对象进行序列化,只能将其属性数据“保存起来”,而方法被忽略(方法不是数据)
2,对象的序列化的时候,会自动调用该对象所属类的这个魔术方法:__sleep()(前提是有该方法)。
且,此时,该方法必须返回一个数组,数组中是“计划”要进行序列化的属性名;
--------------------------------------------------------------------------------------
__wakeup:用于对象的反序列化:
1,对一个对象进行反序列化,其实是恢复其原来保存起来的属性数据,而且,此时必然需要依赖该对象原本的所属类;
2,对象在反序列化的时候,会自动调用该对象所属类的这个魔术方法:__wakeup()
--------------------------------------------------------------------------------------
__tostring()魔术方法——比较常用!
含义:将一个对象“当做”一个字符串来使用的时候,会自动调用该方法,并且在该方法中,可以返回一定的字符串,以表明该对象转换为字符串之后的结果。
注意:如果没有定义该方法,则对象无法当做字符串来使用!

Prev | Next
Pg.: 1 2 3 4 5 6 7 8 9


Back to home | File page

Subscribe | Register | Login | N