构造、析构;重写;设计模式;单例;抽象;重载

造方法析构方法在继承中的表现:

如果子类中没有构造方法的时候,自动调用父类的构造方法,实例化子类的时候,需要根据父类的构造方法来写

代码演示:

子类如果有构造方法,则不能调用父类的构造方法,如果要调用可以选则以下形式:

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 下级可以是protectedpublic

上级: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();

posted @ 2018-03-06 21:39  邹少聪  阅读(204)  评论(1编辑  收藏  举报