一、封装
<?php class Ren{ public $name; public $sex; public $age;//如果不想在外界随便修改和访问这个变量,那就需要封装 } $r = new Ren(); ?>
目的:让类更加安全
类的成员变量都要封装,封装的函数前面是public
封装的方法1、成员变量变为private
<?php class Ren{ public $name; public $sex; private $age;//public----private } $r = new Ren(); ?>
2、在类里做一个成员方法来访问
<?php class Ren{ public $name; public $sex; private $age;//public----private public function setage($age){ }//用函数做一个成员方法 } $r = new Ren(); ?>
3、在该方法加限制条件
<?php class Ren{ public $name; public $sex; private $age;//public----private public function setage($age){ if($age>=18&&$age<=50){ $this->age = $age; }//限制条件 } } $r = new Ren(); //$r->setage(20); $r->setage("zhang"); var_dump($r) ?>
上面的例子有个弊端,封装几个成员变量就要写多少成员方法,代码量比较繁冗。
4、魔术方法
<?php class Ren{ public $name; public $sex; private $age;//public----private public function __set($name,$value){//$name变量名$value变量值 if($name == "age"){ if($value>=18&&$value<=50){ $this->$name = $value; } } else{ $this->$name = $value; } } } $r = new Ren(); $r->name = "张三"; $r->age = 20;//自动调用__set var_dump($r) ?>
class Ren{ public $name; public $sex; private $age;//public----private public function __set($name,$value){//$name变量名$value变量值 if($name == "age"){ if($value>=18&&$value<=50){ $this->$name = $value; } } else{ $this->$name = $value; } } public function __get($name){ return $this->$name; } } $r = new Ren(); $r->name = "张三"; $r->age = 20;//自动调用__set $r->age;//自动调用__get var_dump($r) ?>
赋值语句用__set 取值语句用__get
二、继承
概念:子类可以继承父类的一切
特点:单继承(一个子类只能有一个父类,一个父类可以有多个子类)
<?php class Ren{ public $name; public $sex; private $age; public function say(){ echo "人在讲话"; } } class China extends Ren{//子类继承了父类所有 } $r = new China(); $a = new Ren(); $a->say(); $r->say(); var_dump($a); var_dump($r); ?>
1、重写 override
子类可以对父类的函数重写(子类可以扩展父类没有的内容)
<?php class Ren{ public $name; public $sex; private $age; public function say(){ echo "人在讲话"; } } class China extends Ren{//子类继承了父类所有 public function say(){ echo "中国人在讲话";//扩展父类没有的内容,覆盖父类原来的内容(重写) } } $r = new China(); $r->say(); var_dump($r) ?>
函数重写2
<?php class Ren{ public $name; public $sex; private $age; public function say(){ echo "人在讲话"; } } class China extends Ren{ public function say(){ parent::say();//调用父类里面的方法 echo "你好"; } } $r = new China(); $r->say(); var_dump($r) ?>
2、重载 overload
一般发生在强类型语言中
目的是一个方法实现多个功能
重载的条件: 方法名字相同,参数个数不同,参数个数相同类型不同。
<?php class Ren{ public $name; public $sex; private $age; public function say(){ echo "人在讲话"; } } class China extends Ren{ /* public function test(){ echo "木有参数"; }*/ /*public function test($a){ echo "一个参数"; } */ public function test($c,$b){ echo "两个参数"; } } $r = new China(); $r->test(1,2); var_dump($r) ?>
3、重写的实例
<?php class Suan{ public $a; public $b; public function yunsuan(){ } } class Jia extends Suan{ public function yunsuan(){ return $this->a+$this->b; } } $r = new Suan(); $r1 = new Jia(); $r1->a=45; $r1->b=60; $r1->yunsuan(); ?>
三、多态
当父类引用指向子类实例的时候,由于子类对父类的方法进行了重写,在调用该方法的时候所表现出的不同,我们称为多态
运行多态
编译多态
编译多态就是重载
多态发生在编译的时候产生了不同就是重载