类的继承
简单来说就是一个类里面含有另一个类里面多有的特征,并且还有一些自己的东西,那么就可以说这个类是另一个类的继承基本概念: * 继承:一个类获得另一个类的所有特征,就可以称为继承 * 派生:从一个已有的类产生一个新的类,就可以称为派生(继承和派生其实就是指同一件事情,只是从不同的角度来看待) * 父类/子类:以及存在的类为父类,从已有类为基础新生出来的类为子类。 父类也称之为“基类”,子类也称之为“派生类”。 * 单继承:一个类只能从一个上级类处继承特征信息(就像是一个孩子,正能有一个父亲),但上级类可以有多个子类(就像是一个父亲可以有多个孩子) * 扩展:在子类中需要再定义一些新的特征信息(属性、方法和常量),如果不扩展出新的特征信息,那么这个扩展也没有意义访问(权限)修饰符: 访问的位置有三个: 1、某个类的内部:指在本类中使用 2、某个类的具有继承关系的子(父)类的内部:是指其他方法的某个类中 3、某各类的外部:一般就是独立的代码区,不在任何类中 *public:公共的(用这个修饰符修饰的成员可以在“任何位置”使用) *protected:受保护的,可以在当前类和与之具有继承关系的子(父)类中 *private:私有的,只能在它自己所在的类中使用parent代表父类 parent通常用于在子类中调用父类的成员的时候使用,多数通常就是使用父类的“静态类”的成员--因为parent代表的是类,不是对象 parent常用的两种方法: class lei{ public $v1 = 1; function fun(){ echo "<br>这是父类,数据有:"; echo "<br>lei中v1 = ".$this->v1; } function __construct($v1){ $this->v1 = $v1; } } class lei2 extends lei{ public $v2 = 2; function fun2(){ echo "<br>这是子类,数据有:"; //基本用法 parent::fun();//调用父类的fun方法; echo "<br>lei2中v2=".$this->v2; } function __construct($v1,$v2){ //经典用法; parent::__construct($v1);//调用父类的构造函数来初始化v1; $this->v2 = $v2; } } $dx = new lei2(10,20); $dx->fun2(); 构造方法和析构方法在继承中的表现: 子类中没有定义构造方法时会调用父类的构造方法,所以在实例化子类时,需按照父类的构造方法的形式进行 如果子类定义了自己的构造方法,则不会再去调用父类的构造方法,如果需要,也可以手动调用:parent::__construct(); 重写(override): 重写,又叫覆盖,就是将从父类继承下来的属性或方法重新定义。 举例: //创建一个类,作为父类 class jizhuidongwu{ //定义一个属性 public $v1 = "具有脊椎"; //定义一个方法 function fun(){ echo "<br>我是脊椎动物,特征为:"; echo "<br>属性p1=".$this->v1; } } //创建子类 class human extends jizhuidongwu{ //重写(覆盖)掉父类的属性 public $v1 = "具有28节脊椎骨的脊椎"; public $v2 = "有32颗牙齿"; //重写(覆盖)掉父类中的方法 function fun(){ echo "<br>我是人类,特征为:"; //echo "<br>属性v1:".$this->v1; parent::fun(); echo "<br>属性v2:".$this->v2; } } $dx = new human(); $dx->fun(); 重写的基本要求: 访问控制权限: 下级的访问权限应该不低于上级的访问权限。 比如: 上级为 public(公共的):下级只能是public。 上级为 protected(受保护的):下级就可以是protected和public。 上级为 private(私有的) :下级就可以为public protected private。//但这种情况没有 实际意义 方法的参数形式: 方法的参数形式应该跟父类是相同的: 比如:父类中的方法为:function($v1){}; 那么子类中的方法的参数只能是function($v1){}; 这时候子类中的方法参数不能是:function(){}; 也不能是 function($v1,$v2){}; 私有属性和私有方法的重写问题:私有属性和方法都不能覆盖 但其实子类可以定义跟父类私有的同名属性或方法。 只是当作一个自身的新的属性或方法来看待而已。不过方法的参数必须一致。 构造方法的重写问题:构造方法不但可以像其他普通方法一样重写 而且,比普通方法更宽松:重写的时候参数可以不一致。最终类final class:
简单来说就是一个类 不想作为父类的时候,就可以把它作为一个最终类 形式为: final class 类名{ }最终方法 final method 一个方法如果没有特别的声明,那么下级子类就可以对其进行重写(覆盖). 如果你不想这个方法被下级类重写,就可以将其声明为最终方法。 形式为: final function 方法名(){ }设计模式: 什么叫设计模式: 要求就是让代码易扩展,易维护,易复用。 设计模式就是解决问题的常规做法,就是传说中的经验工厂模式: 工厂就是一个类: 形式: class A{ var $a = "123"; } class B{ var $b = "123"; } class C{ var $c = "123"; } // 定义一个工厂类 作用就是实例化对象 class gongchang{ static function fun($classname){ return new $classname(); } } $A = gongchang::fun("A");//获取一个A类的对象 $B = gongchang::fun("B");//获取一个B类的对象 $C = gongchang::fun("C");//获取一个C类的对象单例模式: 某个类,只允许其“创建”出一个对象,即使去进行多次创建,也只能得到一个对象。 三私一公。 class B{ public $v1 = 10; privatr static $instance; privatr function __construct(){} public static function getnew(){ //如果本类中的$instance还没有数据 if(!isset(B::$instance)){ B::$instance = new self; } renturn B::$instance; } } $o1 = B::getnew(); $o1-> = 100; $o2 = B::getnew(); var_dump($o1); echo"<br>"; var_dump($o2); echo "<br>o1中的v1为:".$o1->v1; echo "<br>o2中的v1为:".$o2->v1;