一,类中的析构函数(__destruct):
析构函数是自动调用的
析构函数主要用于销毁资源
析构函数的调用顺序是先创建的对象最后被销毁(原理是栈的先进后出)
析构函数什么时候被调用
(1)当程序(进程结束)推出时
(2)当一个对象成为垃圾对象时候,该对象的析构方法也会被调用
(3)所谓垃圾对象,就是指没有任何变量再引用它(没有变量再只指向堆中的对象)
(4)一旦对象成为垃圾对象,析构函数就会立即被调用
二,类中使用静态变量(static)
静态变量的引入是为了解决不同的对象实例能够共享同一个变量的问题
静态变量的申明:【访问修饰符】 static $变量名
静态变量的使用:
(1)在类内的使用:SELF::$变量名 或者是 类名::$变量名
(2)在类外的使用:类名::$变量名 或者是 对象名名::$变量名
静态变量与全局变量($global)的比较
之所以在类中引入静态变量是因为:静态变量比全局变量更节省内存,更好的支持变相对象的封装性。
三,类中使用静态方法
静态方法主要是用来并只能用来操作静态变量的
静态方法的使用:类名::方法名 或对象名::方法名
泪的成员方法也能操作静态变量
四,类的继承
php不支持多重继承,如class A extends B,C{}这样是错的
继承中若子类要重写父类的方法,子类方法和父类方法的访问修饰符可不一样,但是子类的访问范围必须大于等于比父类的,比如父类中的方式是public子类中的是protecte这样是不允许的。但是父类的方法若是protected子类的该方法可以是protected或者是public。
php中的方法重载是通过__call实现 的:
class A {public function test1(){echo "test1";}public function test2($param){echo "test2".print_r($param);}public function __call($method,$paramArr){if ($method=="test") {if (count($paramArr)==0) {$this->test1();}if (count($paramArr)==1) {$this->test2($paramArr);}}}}$a = new A();$a->test();$a->test("zjl");
php子类不会自动调用父类的构造函数,若要调用父类的构造函数用parent::__construct()
php中多态的体现主要是子类是否重写父类中的方法。子类重写和不重写父类中的方法方法的执行会有两种不同的状态
六,__set和__get的使用:
class student{private $name="ZJL";private $age="24";public function show(){echo $this->name."".$this->age;}public function __set($var,$value){$this->$var = $value;}public function __get($name){if(isset($name)){return $this->name;}else{return null;}}}$stu = new student();$stu->name = "zjl";$stu->age = "23";$stu->show();echo "".$stu->name;
七,php中的抽象类
为什么要设计抽象类这个技术?
设计抽象类,主要是由于在实际开发中我们可能有这样一种类,是其他子类的父类,但是它本身并不需要实例化,主要用途是让子类继承,这样可以实现代码复用。同时利于项目设计者设计类这样能够使不同开发者有一个同统一的规范,不会导致各个开发者写出来的类出现五花八门的情况。
简单例子:
abstract class Transport{public $wheel;abstract public function move();}class Car extends Transport{public function move(){echo "the car is moving!";}}$car = new Car();$car->move();
3.抽象类的注意事项
(1)基本用法
abstract class 类名{
//方法
//属性
}
(2)如果一个类使用了abstract来修饰,则该类是抽象类(不能被实例化),如果一个方法被abstract修饰,则该方法是抽象方法抽象方法不能实现(不能有方法体)
(3)抽象类可以没有抽象方法,同时还可以有实现了的方法
(4)如果一个类中只要有抽象方法则这个类必须是抽象类
(5)如果一个类继承了抽象类则它必须实现该抽象类的所有抽象方法(除非它自己也是抽象类)
七,php中的接口
1.简单例子:
interface iUsb{public function start();public function stop();}class Upan implements iUsb{public function start(){echo "插入U盘";}public function stop(){echo "拔出U盘";}}class Phone implements iUsb{public function start(){echo "插入手机";}public function stop(){echo "拔出手机";}}$upan = new Upan();$upan->start();$upan->stop();$phone = new Phone();$phone->start();$phone->stop();
2.接口的基本语法
interface 接口名{
//属性
//方法
}
接口的方法不能有方法提
如何实现接口?
class 类名 implements 接口1,接口2{
}接口的作用就是申明一些方法,共其他类实现,接口还体现了编程中我们希望的高内聚低耦合的特点
3.什么情况下考虑使用接口
(1)订规范
(2)订下规范,让别的程序员来实现
(3)当多个类他们之间是平级的关系,这些类都要去实现某个功能,只是实现的方式不一样
4.接口的细节
(1)不能实例化一个接口
(2)接口中的所有方法都不能有方法体
(3)接口中可以有属性但是必须是常量并且是public
interface iUsb{ constant A=90; //注意没有$}echo "price is".iUsb:A;
(4)接口的方法是public(不能是protected),默认就是public
(5)一个接口不能集成其他类,但是能继承其他接口(能继承多个其他的接口)
八,继承和接口的比较
(1)可以认为实现接口是对单一继承的补充
(2)可以在不破坏类层级关系的前提下,对某个类进行功能扩展
九,final关键字
如果我们希望某个类不被其他的类继承(可能处于安全性考虑),可以使用final
final class A{
}
2.如果希望某个方法,比如计算个人所得税的方法不被改写,可以使用final来修饰方法
class A {
final pulic function getRate(){
}
}
3.final不能用于修饰成员属性
十,php面向对象中的常量const
1.基本用法
class A{
const 常量名=赋初值; //必须赋初值(因为常量是不允许修改的)
}
interface A{
const 常量名=赋初值; //必须赋初值(因为常量是不允许修改的)
}
2.使用 类名::常量名 接口名::常量名
3.const前面不要用修饰符,本身默认是public
4.一个常量是不属于每个对象的