类面向对象类的继承

Posted 邹少聪

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了类面向对象类的继承相关的知识,希望对你有一定的参考价值。

类:

它是用于描述“某一些具有共同特征”的物体的概念,是某一类物体的总称。

通常,一个类所具有的共同特征包括2大方面的信息:

外观,形状,描述,数据。。。。。属性

行为,动作,功能。。。。。。。。方法

举例子:

人类;动物类;鸟类

对象:

 

它是指一个具体的“物体”,该物体隶属于某个“类别”(类)。

通常,对象离不开类,没有类,就不能有对象。

//创建类
class computer{
    //定义属性
    var $code ="c1";
    var $color ="black";
    //定义方法
    function show(){
        echo "这台电脑型号是:".$this->code."<br />"."颜色是:".$this->color."<br />";
    }
}
//创建类的对象
$com = new computer();
$com->code ="c2";
$com->color="中国红";
//调用类里面的方法
$com->show();
$com1 = new computer();
//$com1->code="c3";
//$com1->color="黄金黄";
$com1->show();
案例

创建对象的基本形式:

方式1

$对象名1  =  new  类名(); //对象名就是变量名;类是应该定义过了

 

方式2

$CName = C1;

$person3=new $CName();

方式3

$对象名3 = new  self; //self指代类本身,这行代码只能在类内部方法中使用。

 

方式4

通过对象创建对象 new 对象名;//创建该对象所属类的一个新对象

$person4 = new $person3;

对象的传值:2种

 

值传递: 传递的时候,拷贝的是数据本身。默认都是值传递。

 

结果:传递完之后,有了2份同样的数据,但两个变量“相互独立”没有关系。

 

引用传递传递的时候,拷贝的是引用关系。需要使用”才能实现引用传递。

 

结果:传递完之后,数据仍然只有一份,但是两个变量共同指向该数据。

对象的存储跟普通变量的存储有所区别:

普通变量:

对于对象(变量):

类中的成员:属性、方法、类常量

 定义形式:

形式3:     public  $v1;

形式4:     public   $2 = 2;

 

使用形式:

$对象->属性名;

 

注意:属性名前面没有$符号。

 

方法前可以加修饰词:public, protected,private,省略就算public

 

方法中$this关键字:

 

$this是一个“伪对象”,代表当前所属类的当前对象。

 

一个系统函数:get_class(对象) 

 

作用:获得某个对象的“所属类名”——结果只是一个类名字符串。

 

$class_name = get_class($p1); //结果可能是:”Person”

静态属性:

属性前加关键字:static

静态属性就是:只隶属于类本身——也可以看做是所有对象的“共有数据”。

通过特殊的语法:::双冒号语法,也叫范围解释符)

::$静态属性名

静态方法:

使用方法跟静态属性类似:

类名::静态方法名();

 

注意:$this在静态方法中不能使用。

 

self:

含义:代表当前类

使用:通常只能在某个类的某个方法内部代表该类的名称。

构造方法:

1,该方法名字是固定的,为:_ _construct();注意:两个下划线

2,该方法必须是普通方法(不能是静态方法)

3,通常该方法应该是public

4,通常该方法中使用$this这个关键字来对属性进行赋值

5,当new 类名()的时候,其实是在调用该构造方法

6,如果一个类中定义了构造方法,则实例化该类时就会调用该方法,且实例化时的参数需要跟构造方法的参数匹配

析构方法:

销毁信息:_ _destruct()

1,析构方法通常不太需要去定义。

2,析构方法不能调用。

3,析构方法不能有形参。

4,析构方法中可以用于清理一些在php代码结束后不能清理的数据,如生成的文件。

对象销毁的几个情形:

脚本程序运行结束,自动销毁;

明确地unset()一个对象变量,则被销毁;

改变对象变量的值,被销毁;

 

实际上,更本质来说,当一个对象(new 出来的对象)没有任何一个变量指向它的时候,该对象就会被自动销毁——自然,如果整个程序结束,也会销毁。

类的继承:

含义理解:某个类A具有某些特征,另一个类B,也具有A类的所有特征,并且还可能具有自己的更多的一些特征,此时,我们就可以实现:B类使用A的特征信息并继续添加自己的一些特有特征信息。(对象的属性多,类的属性最少)

 

Class jizuidongwu{
    public $prop1 = "有脊椎";
    function show1(){
        echo "<br />特征:" . $this->prop1;
    }

}
Class human extends jizuidongwu{
    public $prop2 = "两脚走路";
    function show2(){
        echo "<br />特征:" . $this->prop1;
        echo "<br />特征:" . $this->prop2;
    }
}
$person1 = new human();
$person1->show2();
例子:

 

基本概念:

继承:一个类从另一个已有的类获得其特性,称为继承。

派生:从一个已有的类产生一个新的类,称为派生。

继承和派生,其实只是从不同的方向(角度)来表述,本质上就是一个事情。

父类/子类:已有类为父类,新建类为子类。父类也叫“基类”,子类也叫“派生类”

单继承:一个类只能从一个上级类继承其特性信息。php和大多数面向对象的语言都是单继承模式。C++是多继承。

扩展:在子类中再来定义自己的一些新的特有的特性信息(属性,方法和常量)。没有扩展,继承也就没有意义了

访问(权限)修饰符:

在类中的成员,通常都可以在前面加上以下3个修饰符:

public:公共的,共有的,公开的

protected:受保护的

private:私有的,

public公有的:

 

语法模式:

 

对象->成员;

 

类名::成员;

 

访问位置分为3个:

 

1:某个类内部:自然是该类的某个方法中

 

2:某个类的具有继承关系的子(父)类的内部:是指其他类的某个方法中。

 

3,某个类的外部:一般就是独立的代码区(不在类中),类似我们之前的代码。

 

class C{
    public $p1 = 1;
    public function showInfo(){
        echo "<br />属性p1=" . $this->p1;
        echo "<br />属性p2=" . $this->p2;//此时可以访问下级的$p2(但很不常用)
    }
}
class D extends C{
    public $p2 = 2;
    public function showInfo2(){
        echo "<br />属性p1=" . $this->p1;//访问的是上级的$p1(常见情形)
        echo "<br />属性p2=" . $this->p2;
    }
}
$d1 = new D();
$d1->showInfo2();
echo "<br />在类外p2=" . $d1->p2;
$d1->showInfo();
代码演示

 

protected 受保护的:

 

protected修饰的成员,可以在当前类或当前类的上下级具有继承关系的类中访问。

 

class C{
    protected $p1 = 1;
    public function showInfo(){
        echo "<br />属性p1=" . $this->p1;
    }
}
class D extends C{
    protected $p2 = 2;
    public function showInfo2(){
        echo "<br />属性p1=" . $this->p1;//访问的是上级的受保护成员$p1
        echo "<br />属性p2=" . $this->p2;//访问的是自己的受保护成员$p1
    }
}
$d1 = new D();
$d1->showInfo2();
echo "<br />在类外p2=" . $d1->p2;//这一行出错,因为在“外面”不能访问受保护成员$p2
代码演示

 

private私有的:

private 修饰的成员,只能在其所在的类中访问。

 

class C{
    private $p1 = 1;
    public function showInfo(){
        echo "<br />属性p1=" . $this->p1;
    }
}
class D extends C{
    private $p2 = 2;
    public function showInfo2(){
        echo "<br />属性p1=" . $this->p1;//访问的是上级的似有成员$p1
        echo "<br />属性p2=" . $this->p2;//访问的是自己的私有成员$p1
    }
}
$d1 = new D();
$d1->showInfo2();
echo "<br />在类外p2=" . $d1->p2;//这一行出错,因为在“外面”不能访问私有成员$p2
代码

 

访问修饰限定符的总结:

范围

本类内

继承关系类内

类外

public

可以

可以

可以

protected

可以

可以

不可以

private

可以

不可以

不可以

 

 parent代表父类:

 

对比:self代表“本类”(自己当前类)

 

parent通常用于在子类中调用父类的成员的时候使用,多数通常就是使用父类的“静态类”成员。

 

——因为parent代表的类,而非对象。

class C{
    public $p1 = 1;
    function showMe(){
        echo "<br />我是父类,数据有:";
        echo "<br />C中p1=" . $this->p1;
    }
    function __construct($p1){
        $this->p1 = $p1;
    }
}
class D extends C{
    public $p2 = 2;
    function __construct($p1,$p2){
        //经典用法
        parent::__construct($p1);//调用父类的构造函数来初始化p1
        $this->p2 = $p2;    //初始化p2
    }
    function showMe2(){
        echo "<br />我是子类,数据有:";
        //基本用法:
        parent::showMe();//调用父类的showMe方法,
        echo "<br />D中p2=" . $this->p2;
    }
}
$d1 = new D(10,20);    //此时就需要尊照构造函数的参数结构来使用
$d1->showMe2();
parent关键字常见用法

以上是关于类面向对象类的继承的主要内容,如果未能解决你的问题,请参考以下文章

JS面向对象 关于类的封装继承多态

python之旅:面向对象之继承与派生

面向对象进阶篇

python 面向对象专题:继承

python 面向对象专题:继承

面向对象--继承和重写