构造、析构;重写;设计模式;单例;抽象;重载
构构造方法和析构方法在继承中的表现:
如果子类中没有构造方法的时候,自动调用父类的构造方法,实例化子类的时候,需要根据父类的构造方法来写
代码演示:
子类如果有构造方法,则不能调用父类的构造方法,如果要调用可以选则以下形式:
parent::__construct();注意:两个下划线
通常为了节省代码,或者增加可读性,一般都是调用父类的构造方法
重写override:
重写是用在继承里面的,调用父类方法时,子类的方法名和参数名相同。
class jizhuianimal{ public $li1 = "有脊椎动物"; function show1(){ echo "<br />特征:".$this->lei1; } } class human extends jizhuianimal{ public $li1 ="具有28节脊椎"; public $li2 ="有32颗牙齿"; function show2(){ echo "<br/>我是人类,特征有:".$this->li1; parent::show1(); echo "<br />".$this->li2; } } $hum1=new human(); $hum1->show2();
注意:如果父类的方法不适合子类,则需要子类完全由自己写
重写的基本要求:
访问控制权限:
不能跃级访问
上级:public 下级同样是public
上级:protected 下级可以是protected,public
上级:private 下级都可以(私有的不能覆盖,是全新的创建)
最终类final class:
如果一种类不想再扩展了,那么就可以用最终类来表示
表达形式:
final class 类名{ 。。。。类定义。。。。}
最终方法final method:
如果一个方法不想被下级覆盖,那么可以将这类方法写为最终方法
表达形式:
final function 方法名(){。。。。方法定义。。。。}
设计模式:
设定一些常用的解决方法,来减少工作量和代码量
工厂模式:
相当于现实生活中的加工厂,这个加工厂可以加工出想要的对象,只要指定一个类名,就可以获取该类的对象
代码演示:
class factory{ //Instance表示“实例”,“对象” static function getInstance($className){ if(file_exists('./class/' . $className . ".class.php")){ $obj1 = new $className(); return $obj1; } else{ return null;//也可以die(); } } } $obj1 = factory::getInstance("A");//获取类A的一个对象 $obj2 = factory::getInstance("B");//获取类B的一个对象 $obj3 = factory::getInstance("A");//再获取类A的一个对象
单例模式:
这种模式一个类中只能创建一个对象,也只能获得一个对象
单例:
1、私有属性(值是对象)
2、私有构造方法(不能new)
3、提供获取对象的方法(这里面判断是否存在)
4、私有克隆
代码演练:
//实现一个单例类:其只能获得一个对象 class B{ public $v1 = 10; private static $instance; private function __construct(){} public static function getNew(){ //如果本类中的$instance还没有数据 if( !isset(B::$instance) ){ B::$instance = new self; } return B::$instance; } private function __clone(){} } //$o1 = new B();//出错,因为构造方法私有了, $o1 = B::getNew(); $o1->v1 = 100; //修改 $o2 = B::getNew(); var_dump($o1); echo "<br />"; var_dump($o2); $o3 = clone $o1; //克隆对象 echo "<br />"; var_dump($o3); $o1->v1 = 123; echo "<br />o1中的v1为:" . $o1->v1; echo "<br />o2中的v1为:" . $o2->v1; echo "<br />o3中的v1为:" . $o3->v1;
$link = mysql_connect(“localhost”, “root”, “123”); //得到一个“连接到mysql数据库”的资源。
$result = mysql_query(“select .....”); //这个是结果集资源
抽象类,抽象方法:
抽象类:
关键字:abstract
表达形式:abstract class 类名{.....类的定义.....}
抽象类又是“父类”,子类继承它的特性就是规范(不可实例化,也就是没有对象)
抽象方法:
抽象方法是一个简单的描述,没有大括号,也没有方法体
例如:abstract function f1($x1, $y, $m) ;
抽象方法里只能写抽象类,要求下级类去完成工作
子类要继承父类的所有抽象方法,除非子类也是抽象类
PHP中的重载技术:
同名不同参的方法(类型,数量)称为重载
例如:
class A{
int function f1(int x){......}
int function f1(int x, int y){.....}
int function f1(string s int m){....}
}
属性重载:如果使用不存在的属性,则会自动调用父类预定义好的方法来处理。
适用的情形对应相应的解决方法:
取值:$v1 = 对象->属性; ===>自动调用类中的__get()方法
赋值:对象->属性 = XX值; ===>自动调用类中的__set()方法
判断是否存在:isset(对象->属性;) ===>自动调用类中的__isset()方法
销毁:unset(对象->属性;) ===>自动调用类中的__unset()方法
方法重载:如果使用不存在的方法,则会自动调用父类预定义好的__call方法(必须带两个参数)来处理此行为。
“魔术方法”:
__get(), __set(), __isset(), __unset(), __call(), __callstatic();