1、PHP面向对象继承详解PHP继承定义两个类:class Book public $goods_name; public $goods_price; public $author; public $publisher;class Phone public $goods_price; public $goods_name; public $brand; public $mode;书与电话有共同的属性,可以提取class Goods public $goods_name; public $goods_price;因此在书类与电话类中这两个属性可以不用写,但书与电话类中就已经没有了这两个属性于是就用到
2、了继承:继承定义:如果一个对象A,使用了另一个对象B的成员,那么我们就称A对象继承了B对象示例:class Goods public $goods_name;public $goods_price;class Book extends Goods public $author;public $publisher;$b = new Book;var_dump($b);输出结果为:object(Book)#1 (4) "author"=> NULL "publisher"=> NULL "goods_name"=> NU
3、LL "goods_price"=> NULL 语法:使用关键字:extends 让一个类继承自另一个类TIPS :继承概念体现在对象上,语法体现在类上此时,特定的称谓:以上的示例中:Goods:称类为父类,基础类Book:称为子类,扩展类语法意义就是面向对象中的代码重用!单继承指的是,一个类,只能存在一个父类(基础类),不能同时继承多个类下面的这种继承就是错误的:class StoreBook extends Goods,Book public $age = 3;instanceof,是否是某类实例体现:一个对象如果是子类的实例,同时也是父类的实例!(实例,通过该类
4、实例化的对象)重写,是个现象!class Goods public $goods_name = ginvip; public $goods_price;class Book extends Goods public $goods_name = gin-php; public $author; public $publisher;$b1 = new Book;var_dump($b1);输出结果为:object(Book)#1 (4) "goods_name"=> string(13) "gin-php" "author"=>
5、; NULL "publisher"=> NULL "goods_price"=> NULL 如果子类与父类出现同名的成员(属性方法),则在实例化子类对象时,只会得到子类中定义的成员,称之为重写!方法也可以重写:class Goods public $goods_name = ginvip; public $goods_price; public function SayPrice() echo $this->goods_price; class Book extends Goods public $goods_name = gin-p
6、hp; public $author; public $publisher; public function SayPrice() echo &,$this->goods_price; $b1 = new Book;$b1->goods_price = 1234.15;$b1->SayPrice();输出结果为:&1234.15一旦重写,父类的代码就不会执行!但是,有些方法是一定会重写的,典型的是构造方法:class Goods public $goods_name = ginvip; public $goods_price; public function
7、_construct($name,$price) $this->goods_name = $name; $this->goods_price = $price; class Book extends Goods public $goods_name = gin-php; public $author; public $publisher; public function _construct($author,$publisher) $this->author = $author; $this->publisher = $publisher; $b1 = new Book
8、(Bruce Lee,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怎样才能调用
9、父类的构造方法呢?parent,父类parent关键字,表示父类的意思!用于在当前类中,强制调用父类成员!典型的做法:将参数传递到子类的构造方法中,再在子类中,强制使用 parent 关键字调用父类的构造方法class Goods public $goods_name = ginvip; public $goods_price; public function _construct($name,$price) $this->goods_name = $name; $this->goods_price = $price; class Book extends Goods public
10、 $goods_name = gin-php; public $author; public $publisher; public function _construct($author,$publisher,$name,$price) /父类构造方法 parent:_construct($name,$price); $this->author = $author; $this->publisher = $publisher; $b1 = new Book(Bruce Lee,ginvip,PHP,1234.56);echo <pre>var_dump($b1);ech
11、o </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-> 当前对
12、象$this 的确定:看上面的parent,或者父类名与:“只有在使用对象调用非静态方法时,才可以使用$this静态方法,无论如何也不能对$this做处理而非静态方法,只有确定了对象,才能确定$this的值!”$this 确定的基本原因:1:哪个对象调用方法,方法内的 $this 就是那个对象2:对象环境,是可以向下传递的 如果当前方法内,已经确定了对象环境,在该方法内,如果出现了静态调用非静态方法,那此时,当前的对象环境,会传递到被静态调用的非静态方法中面试题:$this 永远代表所在的类对象么? 答:不是访问修饰限定符:public , protected , privatepublic:
13、公共的protected:保护的private:私有的用于描述一个成员(属性,方法)在哪里才能被访问的!注意:PHP是采用类的概念,进行成员的限制访问的PHP将访问的代码分成三大区域:类内,类外,继承链上类内是根据:成员在哪里定义与成员在哪里访问来决定类内,类外还是继承链上类内以属性 $property 为例:示例代码:class A public function in_a_func() var_dump($this->property); /在A类中,父类中(继承链)访问 class B extends A /成员定义在B类 public $property = public pro
14、perty; public function in_b_func() var_dump($this->property); /在本类内访问 class C extends B public function in_c_func() var_dump($this->property); /在C类内访问,在子类(继承链)上访问 /$property 成员定义在B类$c = new C;var_dump($c->property);$c->in_c_func();$c->in_b_func();$c->in_a_func();public公共的,指的是,成员在本类
15、内,继承链上的类内,与类外都可以被访问protected保护的,指的是,成员在本类内,继承链上的类内,可以被访问private私有的,指的是,只有本类内,可以访问如何选择:一个原则,尽量体现封装性。封装性,指的是,尽量隐藏内部实现,而仅仅开放外部操作接口!语法上,就是将不需要外部使用的属性,方法,都私有化(保护化),而仅仅留下一些必要的公共方法!注意:1:重写的问题,一定要先明确访问的究竟是哪里所定义的2:私有成员的重写问题私有成员不能被重写。意味着,在相应的私有属性定义的类中,才能访问到相应的私有属性!如:class B public $public_p = in B public; pro
16、tected $protected_p = in B public; private $property = in B protected property<hr /> public function in_b_func() var_dump($this->property); class C extends B public $public_p = in C public; protected $protected_p = in C public; private $property = in C protected property<hr /> public
17、function in_c_func() var_dump($this->property); $o = new C;var_dump($o);以上代码输出的结果为:object(C)#1 (4) "public_p"=>string(11) "in C public""protected_p":protected=>string(11) "in C public""property":"C":private=>string(29) "in
18、C protected property<hr />""property":"B":private=>string(29) "in B protected property<hr />"注意:在处理私有属性时,一定要确定其定义位置!建议是:如果需要通过继承,就使用保护的,少用私有的! 在没有继承时,尽量使用私有的3:在重写时,如果重写成员的访问级别不一致 子类的级别比父类的级别,相等或者弱,可以 子类的级别比父类的级别,强,不可以如:class A protected function f1()
19、 echo in A f1; class B extends A private function f1() echo in B f1; $o = new B;$o->f1();输出结果为:4:兼容性的问题早先的 php 的面向对象不完善,没有访问控制!那时在声明属性时,使用 var 关键字,声明方法时,什么都不使用,直接 function .为了兼容,上面的做法还是可以使用!var , functon 的访问权限,都是 public因此,以下两段代码是一样的:class C var $name; function f1() class D public $name; public function f1()
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1