面向对象编程的介绍:三大特征:封装性, 继承, 多态.

基本介绍:

  面向对象编程又称oop编程,三大特征是: 封装性, 继承, 多态. 说明一下,在php面向对象编程中,多态提的并不是很多,因为php本身就是天生的多态。

抽象的概念:

  在面向对象编程中,将一类事物的共有的属性(成员属性)和行为(成员方法)提取出来,形成一个模板(类), 这种解决问题的方法就是抽象。

访问修饰符的介绍:

  在php中,提供了三种访问控制符 public , protected 和private。

  public          类内部、外部和子类都可以访问;

  protected   表示受保护的,只有本类或子类可以访问;

  private        表示私有的,只有本类内部可以使用;

  强调: 上面的说的访问控制访问,对属性和成员方法都起作用.

  案例说明:

class Person{
    public $name;
    protected $job;
    private $salary;
    //构造函数
    public function __construct($name,$job,$salary){
        $this -> name = $name;
        $this -> job = $job;
        $this -> salary = $salary;
    }
    //三个不同访问修饰符的成员方法
    public function getName(){
        echo "<br>name是" . $this -> name;
    }
    protected function getJob(){
        echo "<br>job是" . $this -> job;
    }
    private function getSalary(){
        echo "<br>salary是" . $this -> salary;
    }
    //在类的内部使用protected的属性和方法
    public function showJob(){
        echo "<br>job是" . $this -> job;
        $this -> getJob();
    }
    //在类的内部使用private的属性和方法
    public function showSalary(){
        echo "<br>salary是" . $this -> salary;
        $this -> getSalary();
    }
}
$p1 = new Person('小明','程序员',13000);
//public的属性和成员方法可以在外部直接访问
echo $p1 -> name;
$p1 -> getName();
//protected的属性和方法不能直接在外部访问需要通过在内部创建一个public方法访问
$p1 -> showJob();
//private的属性和方法不能直接在外部访问需要通过在内部创建一个public方法访问
$p1 -> showSalary();

  访问protected和private属性的三种形式:

  ① 使用魔术方法__get 和 __set 来实现对protected 和 private 属性的操作(详情见魔术方法)

    (1)   优点: 简单,一对__set 和 __get 就可以搞定所有的private , protected属性

    (2)   缺点:  不够灵活,没有办法对各个属性进行控制和验证.

  ②对每一个private 和 protected 属性提供一对get/set方法, 这样就可以分别控制,各个属性,并进行验证.

  案例说明:

//创建一个书类,里面包含书名(bookname)作者(author)价格(price)销量(saleNum)
class Book{
    public $bookname;
    public $author;
    protected $price;
    private $saleNum;
    public function __construct($bookname,$author,$price){
        $this -> bookname = $bookname;
        $this -> author = $author;
        $this -> price = $price;
    }
    //给)价格(price)提供一对get和set方法
    public function getPrice(){
        return $this -> price;
    }
    public function setPrice($price){
        if(is_numeric($price) && $price > 0.0){
            $this -> price = $price;
        }else{
            echo "<br>价格格式异常";
        }
    }
    //给)销量(saleNum)提供一对get和set方法
    public function getSaleNum(){
        return $this -> saleNum;
    }
    public function setSaleNum($saleNum){
        if(is_numeric($saleNum) && $saleNum > 0){
            $this -> saleNum = $saleNum;
        }else{
            echo "<br>销量格式异常";
        }
    }
}
$book1 = new Book('射雕英雄传','金庸',45.50);
echo "<br>射雕英雄传的价格是" . $book1 -> getPrice();
$book1 -> setPrice(63.00);
echo "<br>射雕英雄传的价格是" . $book1 -> getPrice();
$book1 -> setSaleNum(500000);
echo "<br>射雕英雄传的销量是" . $book1 -> getSaleNum();
//输出结果是:
射雕英雄传的价格是45.5
射雕英雄传的价格是63
射雕英雄传的销量是500000

    (1)   优点: 可以对每个属性进行验证,因此很灵活.

    (2)   缺点: 会造成有比较多的setXxx 和 getXxx方法,但是这个没有什么大的问题.

    (3)   推荐使用这种方法,在实际开发中,这种方式比较多.

   ③写一个成员方法,可以根据业务逻辑,一次性对多个属性进行批量操作 。

   案例说明:

//创建一个类(movie)里面包含名称(name)导演(director)成本(cost)票房(tickeOffice)
class Movie{
    public $name;
    public $director;
    protected $cost;
    private $ticketOffice;
    public function __construct($name,$director,$cost){
        $this -> name = $name;
        $this -> director = $director;
        $this -> cost = $cost;
    }
    public function showAllInfo(){
        echo '<br>电影的信息如下:';
        echo '<br>电影名:' . $this -> name;
        echo '<br>电影导演:' . $this -> director;
        echo '<br>电影成本:' . $this -> cost;
        echo '<br>电影票房:' . $this -> ticketOffice;
    }
    //创建一个方法来容纳针对多个属性修改的方法
    public function updateInfo($director, $cost, $ticketOffice){
        //结合setXxx 来完成
        $this->setDirector($director);
        $this->setCost($cost);
        $this->setTicketOffice($ticketOffice);
    }
    //setXxx GetXxx
    public function SetDirector($director){
        $this->director = $director;
    }
    
    public function getDirector(){
        return $this->director;
    }
    public function setCost($cost){
        //加入数据的验证和判断
        if(is_numeric($cost) && $cost > 0.0){
            $this->cost = $cost;
        }else{
            echo '<br> 输入成本格式有问题 ';
        }
    }
    public function getCost(){
        return $this->cost;
    }
    public function setTicketOffice($ticketOffice){
        
        //加入数据的验证和判断
        if(is_numeric($ticketOffice) && $ticketOffice > 0.0){
            $this->ticketOffice = $ticketOffice;
        }else{
            echo '<br> 输入票房格式有问题 ';
        }
    }
    public function getTicketOffice(){
        return $this->ticketOffice;
    }

}
$movie1 = new Movie('醉拳1','袁和平',2000000);
$movie1 -> showAllInfo();
$movie1 -> updateInfo('袁小田',2000000,8000000);
$movie1 -> showAllInfo();
输出结果:
电影的信息如下:
电影名:醉拳1
电影导演:袁和平
电影成本:2000000
电影票房:
电影的信息如下:
电影名:醉拳1
电影导演:袁小田
电影成本:2000000
电影票房:8000000

猜你喜欢

转载自www.cnblogs.com/rickyctbur/p/11089923.html
今日推荐