本节讲解的内容
-
封装
-
继承
-
多态
-
重载
-
重写
前言
PHP的面向对象和JAVA的面向对象一样,都分为三大特征,封装,继承,多态。这三个特征把面向对象进行了很多方面的优化。这三大特征也是在开发面向对象的时候需要考虑的问题。
封装
在面向对象中什么是封装呢?
封装:把抽象出来的数据和对数据的操作封装在一起,数据被保护在内部,程序的其他部分只有通过被授权的操作(成员方法),才能对数据进行操作。
上面有提到抽象,也就是把一类事物共有属性和行为(方法)提取出来,形成一个模板(类), 这种研究问题的方法,我们称为抽象。
就像我们的银行账号,不管是谁的账号,都包括账号,密码,同时也有一些共同的方法,取款,存款,查询余额。我们用封装的思想就是:
<?php class Account{ public $account_no; private $pwd; private $balance; public function __construct($account_no, $pwd = '123456', $balance = 0.0){ $this->account_no = $account_no; $this->pwd = $pwd; $this->balance = $balance; } //存款 public function deposit($amount, $pwd){ if($pwd == $this->pwd){ echo '<br> 存款成功'; $this->balance += $amount; }else{ echo '<br> 密码不正确'; } } //取款 public function withdraw($amount, $pwd){ if($pwd == $this->pwd){ if($this->balance >= $amount){ echo '<br> 取款成功'; $this->balance -= $amount; }else{ echo '<br> 余额不足..'; } }else{ echo '<br>密码错误<strong style="color:transparent">来2源gaodaima#com搞(代@码&网</strong><label>搞gaodaima代码</label>9;; } } //查询 public function query($pwd){ if($pwd == $this->pwd){ echo '<br> 账号' . $this->account_no . ' 余额=' . $this->balance; }else{ echo '<br> 查询密码错误'; } } } $account = new Account(123456789, 'hsp123', 2000000); $account->deposit(30000, 'hsp123'); $account->query('hsp123'); $account->withdraw(99999900, 'hsp123'); $account->query('hsp123');
上面的代码就是银行业务的封装,通过封装代码。我们操作,只需要调用里面提供的方法就可以了,而不用管理里面的业务是怎么处理的。这是一个重要的思想。而我们实现封装的方法是使用访问修饰符,利用访问修饰符的访问特性,把不让外部使用的属性或方法封装起来。而在上节中我们讲过三种访问修饰符。
那么我们怎么访问protected 和 private 成员属性呢?这里有三种方法。
第一种
使用魔术方法__get() 和 __set() 来访问
<?php class Cat{ private $name; private $age; public function __construct($name,$age){ $this -> name = $name; $this -> age = $age; } public function __set($name,$value){ //判断类中有没有这个属性 if(property_exists($this,$name)){ $this -> $name = $value; }else{ echo '没有这个属性'; } } public function __get($name){ return $this -> $name; } } $cat = new Cat('小白',2); $cat -> name = '小花'; echo $cat -> name; ......结果...... 小花