基本介绍:
面向对象编程又称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