您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 咨询培训 > PHP面向对象-继承详解
PHP继承定义两个类:classBook{public$goods_name;public$goods_price;public$author;public$publisher;}classPhone{public$goods_price;public$goods_name;public$brand;public$mode;}书与电话有共同的属性,可以提取classGoods{public$goods_name;public$goods_price;}因此在书类与电话类中这两个属性可以不用写,但书与电话类中就已经没有了这两个属性于是就用到了继承:继承定义:如果一个对象A,使用了另一个对象B的成员,那么我们就称A对象继承了B对象示例:classGoods{public$goods_name;public$goods_price;}classBookextendsGoods{public$author;public$publisher;}$b=newBook;var_dump($b);输出结果为:object(Book)#1(4){["author"]=>NULL["publisher"]=>NULL["goods_name"]=>NULL["goods_price"]=>NULL}语法:使用关键字:extends让一个类继承自另一个类TIPS:继承概念体现在对象上,语法体现在类上此时,特定的称谓:以上的示例中:Goods:称类为父类,基础类Book:称为子类,扩展类语法意义就是面向对象中的代码重用!单继承指的是,一个类,只能存在一个父类(基础类),不能同时继承多个类下面的这种继承就是错误的:classStoreBookextendsGoods,Book{public$age=3;}instanceof,是否是某类实例体现:一个对象如果是子类的实例,同时也是父类的实例!(实例,通过该类实例化的对象)重写,是个现象!classGoods{public$goods_name='ginvip';public$goods_price;}classBookextendsGoods{public$goods_name='《gin-php》';public$author;public$publisher;}$b1=newBook;var_dump($b1);输出结果为:object(Book)#1(4){["goods_name"]=>string(13)"《gin-php》"["author"]=>NULL["publisher"]=>NULL["goods_price"]=>NULL}如果子类与父类出现同名的成员(属性方法),则在实例化子类对象时,只会得到子类中定义的成员,称之为重写!方法也可以重写:classGoods{public$goods_name='ginvip';public$goods_price;publicfunctionSayPrice(){echo$this->goods_price;}}classBookextendsGoods{public$goods_name='《gin-php》';public$author;public$publisher;publicfunctionSayPrice(){echo'&',$this->goods_price;}}$b1=newBook;$b1->goods_price=1234.15;$b1->SayPrice();输出结果为:&1234.15一旦重写,父类的代码就不会执行!但是,有些方法是一定会重写的,典型的是构造方法:classGoods{public$goods_name='ginvip';public$goods_price;publicfunction__construct($name,$price){$this->goods_name=$name;$this->goods_price=$price;}}classBookextendsGoods{public$goods_name='《gin-php》';public$author;public$publisher;publicfunction__construct($author,$publisher){$this->author=$author;$this->publisher=$publisher;}}$b1=newBook('BruceLee','ginvip','PHP',1234.56);echo'<pre>';var_dump($b1);echo'</pre>';输出结果为:object(Book)#1(4){["goods_name"]=>string(13)"《gin-php》"["author"]=>string(9)"BruceLee"["publisher"]=>string(6)"ginvip"["goods_price"]=>NULL}怎样才能调用父类的构造方法呢?parent,父类parent关键字,表示父类的意思!用于在当前类中,强制调用父类成员!典型的做法:将参数传递到子类的构造方法中,再在子类中,强制使用parent关键字调用父类的构造方法classGoods{public$goods_name='ginvip';public$goods_price;publicfunction__construct($name,$price){$this->goods_name=$name;$this->goods_price=$price;}}classBookextendsGoods{public$goods_name='《gin-php》';public$author;public$publisher;publicfunction__construct($author,$publisher,$name,$price){//父类构造方法parent::__construct($name,$price);$this->author=$author;$this->publisher=$publisher;}}$b1=newBook('BruceLee','ginvip','PHP',1234.56);echo'<pre>';var_dump($b1);echo'</pre>';输出结果为:object(Book)#1(4){["goods_name"]=>string(3)"PHP"["author"]=>string(9)"BruceLee"["publisher"]=>string(6)"ginvip"["goods_price"]=>float(1234.56)}注意:self,parent,$this的区别self::当前类本身parent::当前父类$this->当前对象$this的确定:看上面的parent,或者父类名与:“只有在使用对象调用非静态方法时,才可以使用$this静态方法,无论如何也不能对$this做处理而非静态方法,只有确定了对象,才能确定$this的值!”$this确定的基本原因:1:哪个对象调用方法,方法内的$this就是那个对象2:对象环境,是可以向下传递的如果当前方法内,已经确定了对象环境,在该方法内,如果出现了静态调用非静态方法,那此时,当前的对象环境,会传递到被静态调用的非静态方法中面试题:$this永远代表所在的类对象么?答:不是访问修饰限定符:public,protected,privatepublic:公共的protected:保护的private:私有的用于描述一个成员(属性,方法)在哪里才能被访问的!注意:PHP是采用类的概念,进行成员的限制访问的PHP将访问的代码分成三大区域:类内,类外,继承链上类内是根据:成员在哪里定义与成员在哪里访问来决定类内,类外还是继承链上类内以属性$property为例:示例代码:classA{publicfunctionin_a_func(){var_dump($this->property);//在A类中,父类中(继承链)访问}}classBextendsA{//成员定义在B类public$property='publicproperty';publicfunctionin_b_func(){var_dump($this->property);//在本类内访问}}classCextendsB{publicfunctionin_c_func(){var_dump($this->property);//在C类内访问,在子类(继承链)上访问}}//$property成员定义在B类$c=newC;var_dump($c->property);$c->in_c_func();$c->in_b_func();$c->in_a_func();public公共的,指的是,成员在本类内,继承链上的类内,与类外都可以被访问protected保护的,指的是,成员在本类内,继承链上的类内,可以被访问private私有的,指的是,只有本类内,可以访问如何选择:一个原则,尽量体现封装性。封装性,指的是,尽量隐藏内部实现,而仅仅开放外部操作接口!语法上,就是将不需要外部使用的属性,方法,都私有化(保护化),而仅仅留下一些必要的公共方法!注意:1:重写的问题,一定要先明确访问的究竟是哪里所定义的2:私有成员的重写问题私有成员不能被重写。意味着,在相应的私有属性定义的类中,才能访问到相应的私有属性!如:classB{public$public_p='inBpublic';protected$protected_p='inBpublic';private$property='inBprotectedproperty<hr/>';publicfunctionin_b_func(){var_dump($this->property);}}classCextendsB{public$public_p='inCpublic';protected$protected_p='inCpublic';private$property='inCprotectedproperty<hr/>';publicfunctionin_c_func(){var_dump($this->property);}}$o=newC;var_dump($o);以上代码输出的结果为:object(C)#1(4){["public_p"]=>string(11)"inCpublic"["protected_p":protected]=>string(11)"inCpublic"["property":"C":private]=>string(29)"inCprotectedproperty<hr/>"["property":
本文标题:PHP面向对象-继承详解
链接地址:https://www.777doc.com/doc-2850542 .html