类的继承 设计模式

类的继承
简单来说就是一个类里面含有另一个类里面多有的特征,并且还有一些自己的东西,那么就可以说这个类是另一个类的继承

基本概念:
* 继承:一个类获得另一个类的所有特征,就可以称为继承
* 派生:从一个已有的类产生一个新的类,就可以称为派生
(继承和派生其实就是指同一件事情,只是从不同的角度来看待)
* 父类/子类:以及存在的类为父类,从已有类为基础新生出来的类为子类。
父类也称之为“基类”,子类也称之为“派生类”。
* 单继承:一个类只能从一个上级类处继承特征信息(就像是一个孩子,正能有一个父亲),但上级类可以有多个子类(就像是一个父亲可以有多个孩子)
* 扩展:在子类中需要再定义一些新的特征信息(属性、方法和常量),如果不扩展出新的特征信息,那么这个扩展也没有意义

访问(权限)修饰符:
访问的位置有三个:
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;

猜你喜欢

转载自www.cnblogs.com/LQK157/p/9142869.html