php基础(29)_面向对象的三大特性【二】_继承、方法重载

论坛 期权论坛 脚本     
已经匿名di用户   2022-5-29 19:29   1449   0

面向对象三大特性:
封装、继承、多态

封装--什么是封装(上一节已讲)
封装就是把抽象出的数据和对数据的操作封装在一起,数据被保护在内部,程序的其他部分只有通过被授权的操作(成员方法),才能对数据进行操作。

继承--什么是继承
所谓继承就是一个子类通过extends 父类名 把父类的一些(public/protected)属性和(public/protected)方法继承下来

继承的基本语法是:
class 类名 extends 父类名
{
//在写自己需要的属性和方法;
}

继承带来的好处:
继承可以解决代码复用,让我们的编程更加靠近人类思维,当多个类存在相同的属性(变量)和方法时,可以从这些类中抽象出父类,在父类中定义这些相同的属性和方法,所有的子类不需要重新定义这些属性和方法,只需要通过继承,这样,子类就会自动拥有父类定义的属性和方法.

举例:

<?PHP
class Stu
{
    public $name;
    protected $age;
    protected $grade;
    public function showInfo()
    {
        echo $this->name."||".$this->age;
    }
}
class Pupil extends Stu
{
    public function testing()
    {
        echo "小学生考试...";
    }    
}
class Graduate extends Stu
{
    public function testing()
    {
        echo"研究生考试...";
    }
}    
//创建学生
$stu1=new Pupil();
$stu1->name="小明";
$stu1->testing();
$stu1->showInfo();
//创建一个研究生
$stu2=new Graduate();
$stu2->name="小艾";
$stu2->testing();
$stu2->showInfo();
?>
---------- 编译结果 ----------
小学生考试...小明||研究生考试...小艾||

结论
1、子类最多只能继承一个父类(指直接继承),如果希望继承多个类的属性和方法,则使用多层继承,形式如下:
class A{...}
class B extends A{...}
class C extends B{...}
2、子类可以继承其父类(或者超类)的public,protected修饰的变量(属性)和函数(方法)
3、在创建某个子类对象时,默认情况下不会自动调用其父类的构造函数,这点与java是不一样的
4、如果在子类中需要访问其父类的方法(构造方法/成员方法 方法的访问修饰符是public/protected),可以使用父类::方法名()(或者parent::方法名(),注意parent不能大写!)来完成。
5、如果子类(派生类)中的方法和父类(基类)方法相同,我们称之为方法重写/方法覆盖(下一节详述)

重载
基本概念:函数名一样,通过函数的参数个数或者是参数类型不同,达到调用同一个函数名,但是可以区分不同的函数

方法重载(overload)
"重载"是类的多态的一种实现。函数重载指一个标识符被用作多个函数名,且能够通过函数的参数个数或参数类型将这些同名的函数区分开来,调用不发生混淆。调用的时候,虽然方法名字相同,但根据参数表可以自动调用对应的函数。
php5虽然可以支持重载,但重载在具体的实现上,和其他语言还有较大的差别。如果你试图定义多个同名函数(如下),那你的程序运行将会报错

小结:关于重载
1、php5默认情况下不直接支持方法重载
2、php5 可以同__call魔术方法,模拟一个方法重载的效果(官方不推荐使用)

举例:

<?PHP
class A
{
    public function test1($p)
 {
     echo "接收一个参数";
  echo "\n接收到的参数是:";
  var_dump($p);
 }
 public function test2($p)
 {
     echo "接收两个参数";
  echo "\n接收到的参数是:";
  var_dump($p);
 }
 //__call是它一个对象调用某个方法,而该方法不存在,则系统自动调用__call,即把函数名(test)传给了$method,把参数(1、56、90)以数组的形式做成一个数值集传给$p
 function __call($method,$p)
 { 
        if($method=="test")
     {
   var_dump($p);
         if(count($p)==1)
      {
          $this->test1($p);
      }
      else if(count($p)==2)
      {
          $this->test2($p);
      }
     }
 }
}
$a=new A();
$a->test(1);
$a->test(56,90);
?>
---------- 编译结果 ----------
array(1) {
  [0]=>
  int(1)
}
接收一个参数
接收到的参数是:array(1) {
  [0]=>
  int(1)
}
array(2) {
  [0]=>
  int(56)
  [1]=>
  int(90)
}
接收两个参数
接收到的参数是:array(2) {
  [0]=>
  int(56)
  [1]=>
  int(90)
}

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:81
帖子:4969
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP