黑马程序员技术交流社区

标题: 【黑马程序员济南】PHP课程同步笔记:PHP类的三大特性 [打印本页]

作者: 小鲁哥哥    时间: 2017-7-31 15:57
标题: 【黑马程序员济南】PHP课程同步笔记:PHP类的三大特性
本帖最后由 小鲁哥哥 于 2017-7-31 16:01 编辑


【黑马程序员济南】PHP课程同步笔记:PHP类的三大特性

PHP类的三大特性:封装、继承、多态,今天我们来讲解一下其中的两大特性,继承和封装
继承

基本概念:
      可以使一个类继承并拥有另一个已经存在类的成员属性和方法,被继承的类称为父类或基类,继承类为子类。通过extends关键字实现继承关系。通俗来说,要有继承就得有一个“根源”,这“根源”你可能想像你以后生了儿子或者女儿,他们会从你这里得到一些“东西(属性和方法)”,这样你的“后代”就是持有你(根源)所有的一些特征了。

继承的基本语法:

      class  新的类名  extends  另一个已有的类名{
            //新的类的成员定义。
      }

先看代码:
[PHP] 纯文本查看 复制代码
<?php
//传智播客黑马程序员济南中心出品

//动物类
class Dongwu{
    var $point = "动";
}
//脊椎动物类
class Jizhui{
    var $point1 = "动";
    var $point2 = "有脊柱";
}

//鸟类
class Bird{
    var $point1 = "动";
    var $point2 = "有脊柱";
    var $point3 = "有翅膀";
}
其中有一些“重合”的特征信息,我们可以改造为如下:

[PHP] 纯文本查看 复制代码
<?php
//传智播客黑马程序员济南中心出品

//动物类
class Dongwu{
    var $point = "动";
}
//脊椎动物类
class Jizhui extends Dongwu{
    //var $point1 = "动";//继承自动物类,这个就不用写了
    var $point2 = "有脊柱";
}

//鸟类
class Bird extends Jizhui{
    //var $point1 = "动";//继承自脊椎动物类,这两个就不用写了
    //var $point2 = "有脊柱";
    var $point3 = "有翅膀";
}

$j1 = new Jizhui();
var_dump($j1);
$b1 = new Bird();
var_dump($b1);


输出结果:
object(Jizhui)#1 (2){
      ['piont2'] => string(9) "有脊柱"
      ['point1']=>string(6) "动"
}
object(Bird)#2 (4){
      ['point3'] => string(9) "有翅膀"
      ['point2'] => string(9) "有脊柱"
      ['point1']=>string(6) "动"
}
注意:PHP不能多层继承,如:class A extends B extends C,这样的继承在PHP中是无效的,PHP里只有单继承,不能多继承。

封装
      把成员方法和成员属性封装到类中,隐藏属性和方法实现的细节,通过public、protected、private等限定类成员的访问权限,数据被保护在内部,只通过被授权的成员方法才可以操作,尽可能的对成员进行封装。
      控制一个属性或方法的可访问性,依赖于如下3个修饰符:
            public:                公共的;        表示“哪里都”可以访问;
            protected:        受保护的;        表示“只有自己家族内部”可以访问;
            private:                私有的;        表示“只有自己”可以访问
      这三个修饰符从作用范围上来讲应该像这样从大到小排序:public→protected→private之所以说是在作用范围上,是因为类把一些属性和方法进行了封装,这个封装就决定了数据的“可见性”,这样我们在类的外面不能够随意修改所定义的属性和方法而只能够进行调用,这就是封装的好处,同时也提高了安全性。

可访问性的总结如下:
访问修饰符  \     位置
  一个类的内部
  一个类的继承类内部
  一个类的外部
public
  yes
yes
yes
protected
  yes
yes
no
private
  yes
no
no
他们的可访问情形,代码演示如下:
[PHP] 纯文本查看 复制代码
<?php
//传智播客黑马程序员济南中心出品

class A{
    public $p1 = 1;
    protected $p2 = 2;
    private $p3 = 3;
    function ShowInfo(){
        echo "A中访问自己的p3:".$this->p3;//输出结果为3
    }
}
class B extends A{
    public $p4 = 4;
    function ShowInfo(){
        echo "B中访问A中的p1:".$this->p1;//输出结果为1
        echo "B中访问A中的p2: ".$this->p2;//输出结果为2
//echo  "B中访问A中的p3: ".$this->p3;//报错,继承类中访问父类受保护的属性
        echo  "Bz中访问自己的p4: ".$this->p4;//输出结果为4
    }
}
$b1 = new B();
echo "b1->p1:".$b1->p1;//结果为1
//echo "b1->p2:".$b1->p2;//报错,外部访问父类中三种修饰符属性的结果
//echo "b1->p3:".$b1->p3;//报错
echo "b1->p3:".$b1->p4;  //结果为4
$b1 ->ShowInfo();
$a1 = new A();
$a1->ShowInfo();
其他注意事项:
      1,访问控制修饰符只用于修饰属性和方法(含静态的和实例的),不用于修饰类常量;
      2,属性前面必须有修饰符,之前的var就是public;
      3,方法前面可以没有修饰符,如果没有,则默认当做“public”;











欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2