继承并不改变类的结构。而是表名了两个类之间存在着某种关系,使得其中的成员看起来像是在别的类中存在。
主要的语法流程是:但我们new一个对象时,会在数据区先开辟一个存储空间,然后将对象进行初始化。初始化时,先是在其对象所对应的类空间去找变量或者方法,当无法找到时,如果发现其有一个继承关系,则会接着去它的父类中寻找。因此,我们所说的继承并不改变累的结构,仅仅是在两个继承类之间多了一个继承的关系。(比如说重写操作:当子类和父类中有相同的方法名是,掉用函数,先找的是当前对象对应类中的方法,当找到后就不会继续寻找了。这时,我们看上去像是父类中的方法被覆盖了,这就是重写的概念)。
<?php header("Content-Type:text/html;charset=utf-8"); Class A { public $p1=1; const c1=3; static $d1=5; private $e1=7; function f1(){ echo "我是A中的方法!"; } } Class B extends A{ public $p2=2; const c2=4; static $d1=6; private $e2=8; function f1(){ echo "我是B中的方法!".$this->e1; echo "我是B中的方法!".$this->e2; } } $o1=new B(); var_dump($o1); echo "<br/>"; $o1->f1(); echo "<br/>"; A::f1();//此处不建议这么写,这是不严格的语法。 echo "<br/>"; ?>
注意:var_dump($o1)中有变量e1的值,并且标明了“ ["e1":"A":private]=> int(7)”,这表明了私有属性也可以被继承类B中调用变量e1是,会显示未定义变量。这说明静态变量虽然可以被继承,但是能调用它的只有它所在的类(子类虽能继承,但无法调用)。
<?php header("Content-Type:text/html;charset=utf-8"); Class A { public $p1=1; const c1=3; static $d1=5; private $e1=7; function f1(){ echo "我是A中的方法!".self::$d1; } } Class B extends A{ public $p2=2; const c2=4; static $d2=6; private $e2=8; function f1(){ echo "我是B中的方法!".self::$d1; //echo "我是B中的方法!".self::$d2; } } echo "<br/>"; echo "类B中的静态属性d2:".B::$d2; echo "<br/>"; echo "类B中能否继承父类A中的静态属性d1:".B::$d1; echo "<br/>"; echo "类A中的静态属性d1:".A::$d1; echo "<br/>"; echo "类A中能否访问子类B中的静态属性d2:".A::$d2;
从中我们可以看出,子类中可以访问到父类中的静态属性,但是父类无法得到子类中的静态属性。因为系统在执行过程中是“从下至上”的查找过程,先从当前类中找,如果找不到,就向上以层(父类)查找。而父类不能向下一级(子类)查找。
注意:静态属性并不和普通的属性一样,存在于对象的数据空间中。
最后,从两个实例可得:继承并未改变其中类的任何结构。仅仅是对象中有了父类的一些东西。并且可以从父类中调用函数。(简单来说就是当创建对象时,一些能够存储的数据都会存储在当前对象所创建的数据存储区中,后面通过对象的一些操作都是在该数据存储区中进行的,与我们前面所写的类没有直接关系。类写好了后,不会从外部将其进行改变)。
Atas ialah kandungan terperinci PHP中继承实例详解. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!