💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
# 面向对象的三大特点 ![](https://box.kancloud.cn/441e34cbb7a5d3c8bfd5d2c6864f4fa6_677x340.png) 属性必须指定修饰符,方法默认是public 函数之间可以互相调用,但需要用this指向 ## 封装 姓名,性别公开,电话号码,工资是隐私的。 访问proteced,private的变量,使用下面**魔术方法**: __set(), __get(); ### 赋值操作: `__set($name,$value);` ### 获取属性的值 `__get($name);` ~~~ //set get无法单独效验,虽然方便,但无法个性化 class A{ private $n1; private $n2; //set管理所有私有属性 public function __set($pro_name,$pro_val){ $this->pro_name=$pro_val; } //获取所有属性的值 public function __get($pro_name){ if(isset($pro_name)){ return $this->pro_name; }else{ return null; } } public function add($n1){ $this->n1=$n1; $this->n2=$n2; } } $aa=new A(); $aa->n1="dddd"; echo $aa->n1; ~~~ #### 1.查看 ~~~ <? echo "<meta charset='utf-8'>"; class Child{ public $name; protected $age; private $salary; function __construct($name,$age,$salary){ $this->name=$name; $this->age=$age; $this->salary=$salary; } //通过公开函数调用私有内容 function shows($username){ if($username=="111"){ echo $this->name."||".$this->age."||".$this->salary; }else{ echo "无权限查看"; } } //通过公开函数修改私有属性 public function setage($age){ if($age>100){ echo "你的年龄范围不对"; }else{ $this->age=$age; } } } $cc=new Child("田伟","18","888"); $cc->name="dsfsd"; echo $cc->name; echo $cc->setage(66); echo $cc->shows("111"); ~~~ #### 2.修改 $cc->name="田伟"; 写修改方法 ## 继承 继承保证代码的复用性 ![](https://box.kancloud.cn/85500de8f8037a67ef3f8f15898d8f56_520x335.png) ~~~ class stu{ public $name; public $age; public function showinfo(){ echo $this->name; } } class pupil extends stu{ public function testing(){ echo "小学生考试"; } } class graduate extends stu{ public function testing(){ echo "大学生考试"; } } ~~~ 注意点: 1. 子类只能继承父类的public,protected ,不能继承private 2. 一个子类只能继承一个父类,但可以通过继承2次达到效果。 3. 子类默认不会自动继承父类的构造方法。 4.如果要调用发父类的构造方法或其他方法,可以通过 父类名::__construct(); parent::_construct(); ![](https://box.kancloud.cn/1524c665098a3f605398766212231418_428x469.png) ## 多态,重载 overload 一样的函数名,但是参数个数不一样,达到调用同一个函数名,但是可以区分不同的函数。 重载函数:__call(),官方并不推荐。 总结: 1.php5 默认情况下不直接支持方法重载 2.可以通过 __call()模拟方法重载效果 3.PHP5魔术常量 __LINE__ __FILE__ __FUNCTION__ 必须在函数里面 __CLASS__ 必须在类里面调用 __METHOD__ __DIR__ __NAMESPACE__ ## 方法重写、覆盖 override 父类知道每个子类都有某个方法,但父类不能确定子类方法的具体如何写,这个时候子类就可以重写覆盖这个方法。 注意: **子类和父类的名称,参数必须完全一样**,参数名称可以不一样 覆盖的时候,子类的修饰符访问范围不能低于父类的修饰符访问权限。 子类覆盖是在子类的区域内覆盖,并不是修改了父类的程序。此时还是可以调用这个父类的方法 ~~~ class A{ public $name; function cry(){ echo "不知道怎么叫。。。"; } } class Dog extends A{ //覆盖 function cry(){ echo "小狗旺旺叫。。"; parent::cry(); } } $dog1=new Dog(); $dog1->cry(); ~~~