一、构造函数、析构函数
(1)构造函数:__construct()
说明:对象被实例化时调用,可带参数
例:
$obj = new A($a,$b);
(2)析构函数:_destruct()
说明:页面执行结束调用。用于清理程序资源
二、对象的引用
(1)不同的引用,同一个对象:
$a = new A;
$b = $c = $a;//就像a、b、c(对象别名)共住一个房子(对象)
unset($a);//对象未销毁
unset($a,$b,$c);//对象销毁
(2)同一个引用,共用一个变量,只是名字不同:
$a = new A;
$d = &$a;
unset($a);//对象销毁
unset($b);//对象销毁
(3)复制对象,不同的对象:
$a = new A;
$b = clone $a;
三、继承:extends
说明:
(1)单继承,extends后面只能接一个父类
(2)重写的方法必须与原方法(参数,类型)完全相同
优点:子类成员不用重复定义
例:
class Zi extends Fu{
protected function cry(){
parent::cry();
}
}
四、访问控制,三种访问权限:
(1)public :公有的,可以在任何地方被访问
(2)protected :受保护的,可以被自身及子类访问
(3)private :私有的,只能被自身访问
五、静态成员:static
(1)静态属性用于保存类的共有数据
(2)和类存储在一起,而不是和对象,因此可以不用实例化直接调用。
(3)静态方法里面只能访问静态属性,不能使用this。
self::也能访问自身非静态成员
例:
class A {
public static $a=1;
const STR = 'str';//常量,不允许修改
}
在类中调用:self::$a(自身、父类) 或 static::$a(自身)
在类外调用:A::$a
$AC = new A;
$BC = new A;
$AC::$a=2;
echo $BC::$a;
六、final关键字
(1)子类中编写跟父类方法名完全一致的方法可以完成对父类方法的重写(有参数也不影响)。
(2)父类方法前添加final关键字,无法在子类里重写。
(3)对于不想被任何类继承的父类可以在父类class之前添加final关键字。
(4)添加final关键字的类/方法,只是不能被重写/继承,但可以调用
例:
final class A {
final public function a(){}
}
七、接口:interface
(1)只能为public
(2)只能声明常量
(3)全部为抽象方法
(4)类必须实现接口全部的方法
(5)接口可extends(继承)多接口
(6)类可implements(实现)多接口
(7)可以用$a instanceof A判断对象时候实现了接口
(8)重写的方法必须与原方法(参数,类型)完全相同
优点:功能*组合。如,用户:登录,发消息,传图片等,放在一个类中太庞大不灵活,可做成接口,用的时候再调;注册:验证邮箱,加密。
例:
interface a {
public function saya();
} interface b {
public function sayb();
} interface c {
public function sayc();
} interface d extends a,b {
public function sayd();
} class fu implements d,c{
public function saya(){}
public function sayb(){}
public function sayc(){}
public function sayd(){}
}
八、抽象类:abstract
(1)abstract关键字用于定义抽象类
(2)在抽象方法前面添加abstract关键字,不需要具体的实现
(3)抽象类中可以包含普通的方法,有方法的具体实现
(4)继承抽象类的子类需要实现抽象类中定义的抽象方法
优点:定义类规范。如,定义短信规范连接不同的服务商,定义数据库规范连接不同数据库
例:
abstract class A {
abstract public function a();
public b(){}
}
九、魔术方法
(1)__tostring() :当对象被当做string使用时方法自动调用
例:
echo $obj;
public function __tostring(){
return '__tostring';
}
(2)__invoke() :当对象被当成方法被调用时方法自动调用
例:
$obj(4);
方法的重载:
(3)__call($a,$arr) :对象调用不存在的方法自动调用
(4)__callstatic($a,$arr) :对象调用不存在的静态方法自动调用,方法必须加关键字static
例:function static __callstatic(){}
属性的重载
(5)__set() :在给不可访问属性赋值时,__set()会被调用 例:function __set($name,$value)
(6)__get():读取不可访问属性的值时,__get()会被调用 例:function __get($name)
(7)__isset():当对不可访问属性调用isset()或empty()时,__isset()会被调用
(8)__unset():当对不可访问的属性调用unset()时,__unset()会被调用
所谓不可访问属性,实际上就是在调用某个属性时发现这个属性没有被定义,这时候不同的操作会触发不同的魔术方法
(9)__clone():对象被clone时自动调用
优点:自定义复制哪些属性,使被复制的对象的一些属性不被复制过去。
例:
obj1 = clone $obj; //实现对象复制,变成值相同的两个对象