若是子类中没有构造方法的时候,自动调用父类的构造方法,实例化子类的时候,须要根据父类的构造方法来写php
代码演示:mysql
子类若是有构造方法,则不能调用父类的构造方法,若是要调用能够选则如下形式:sql
parent::__construct();注意:两个下划线数据库
一般为了节省代码,或者增长可读性,通常都是调用父类的构造方法设计模式
重写是用在继承里面的,调用父类方法时,子类的方法名和参数名相同。ide
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();
注意:若是父类的方法不适合子类,则须要子类彻底由本身写ui
访问控制权限:this
不能跃级访问spa
上级:public 下级一样是public设计
上级:protected 下级能够是protected,public
上级:private 下级均可以(私有的不能覆盖,是全新的建立)
若是一种类不想再扩展了,那么就能够用最终类来表示
表达形式:
final class 类名{ 。。。。类定义。。。。}
若是一个方法不想被下级覆盖,那么能够将这类方法写为最终方法
表达形式:
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) ;
抽象方法里只能写抽象类,要求下级类去完成工做
子类要继承父类的全部抽象方法,除非子类也是抽象类
同名不一样参的方法(类型,数量)称为重载
例如:
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();