当前位置:Gxlcms > PHP教程 > 类的基础定义和概念(扩展2)

类的基础定义和概念(扩展2)

时间:2021-07-01 10:21:17 帮助过:19人阅读

关于继承

1.继承是从一个基类得到一个或多个派生类的机制

2.继承自另外一个类的类被称为该类的子类,这种关系通常用父子关系描述,子类将继承父类的特效,这些特性由属性和方法组成。

(父类也可以叫超类,基类,子类也被称为父类的扩展)

3.派生类可以扩展和修改父类的功能

< ?php    class ShopProduct{         function getSummaryLine() {            echo 'i am father\'s getSummaryLine function '."\n";        }    }    class Cdproduct extends ShopProduct{         function getSummaryLine() {            echo 'i am son\'s getSummaryLine function'."\n";        }    }    $product1 = new ShopProduct();    $product2 = new Cdproduct();    $product1->getSummaryLine();    echo "-------------\n";    $product2->getSummaryLine();?>

输出结果:

i am father's getSummaryLine function -------------i am son's getSummaryLine function  //变了

4.要引用一个类而不是对象的方法,可使用::而不是->。

5.在子类中定义构造方法时,需要传递参数给父类的构造方法,否则你得到的可能是一个不完整的对象.

需要使用 parent::__construct()

< ?php    class ShopProduct{        public $title;         function __construct($title) { //父类的构造方法,这里看到需要传入一个参数$title  //————第四步            $this->title = $title;            echo 'i am father\'s construct and title is'.$title."\n";        }        function getSummaryLine() {            echo 'i am father\'s getSummaryLine function '."\n";        }    }    class Cdproduct extends ShopProduct{        public $sonTitle;        function __construct($title,$sonTitle) { //子类的构造方法,这里添加一个新的参数$sonTitle  //————第二步            parent::__construct($title); //这里就是调用父类的构造方法,因为父类的构造方法是只有一个参数$title,所以只需要传入一个  //————第三步            $this->sonTitle = $sonTitle;  //这个就是子类自己的构造方法想增加的一个属性                                          //上面这几行加起来的意思就是子类需要父类的构造方法,并且在父类的构造方法的基础(获得了父类的$title)上增加一个子类自己的属性($sonTitle)            echo  'i am son\'s construct and title is'.sonTitle."\n";        }        function getSummaryLine() {            echo 'i am son\'s getSummaryLine function'."\n";        }    }    $product1 = new ShopProduct('TTTTitle');       echo "-------------\n";    $product2 = new Cdproduct('TTTitle2222','dasdsada'); //————第一步(如果单单看Cdproduct这个子类的实例化的过程的话,就是四步)    echo "-------------\n";    $product1->getSummaryLine();    echo "-------------\n";    $product2->getSummaryLine();?>

输出结果是

i am father's construct and title isTTTTitle-------------i am father's construct and title isTTTitle2222i am son's construct and title issonTitle-------------i am father's getSummaryLine function -------------i am son's getSummaryLine function

每个子类都会在设置自己的属性前调用父类的构造方法。父类仅需要知道自己的数据。我们应该避免告诉父类任何关于子类的消息,这是一条经验规则。(其实也就是在面向对象开发中,“专注特定任务,忽略外界上下文”)

6.public,private,protected-可见性关键字允许我们只公开类中客户需要的部分,这给对象设置一个清晰的接口。

public 会全部开放,private只给当前类调用,protected可以给当前类和子类调用,安全等级是public < protected < private(我们倾向于严格控制可访问性)

6.1访问方法

基于安全性考虑,严格控制可访问性,所以有一种方法可以实现

class ShopProduct{  private $title;  //因为设置了private,不是当前类是没办法访问这个属性  public function getTitle(){  //但是我们又要访问这个属性,所以设置了公用方法来访问,我们可以在这个方法里面加一些过滤和判断,提高进一步的可访问性。    return $this->title;  }  public function setTitle(){  //这是set的方式,当然不能很简单的就set了,要增加相关的过滤性操作。    return $this->title = 'hahahhah';  }  }

人气教程排行