PHP面向对象之旅:访问控制

让你的类更加安全
服务器君一共花费了236.238 ms进行了5次数据库查询,努力地为您提供了这个页面。
试试阅读模式?希望听取您的建议

在PHP5中,可以在类的属性和方法前面加上一个修饰符(modifier),来对类进行一些访问上的控制。

下面表格显示了访问的权限。

修饰符 同一个类中 子类中 全局
private Yes    
protected Yes Yes  
public Yes Yes Yes(默认)

Private的访问权限

private 不能直接被外部调用,只能由当前对象调用。

比如你可以借钱给别人,但不希望别人知道你钱包里面有多少钱。我们把它用private隐藏起来。


<?
class You {
	private $youMoney = 1000;
	//借出钱的方法
    public function loan($number)
    { 
    	if($this->youMoney >= $number)
        {
    	    $this->youMoney = $this->youMoney - $number;
    	    echo "好,这里借给你 $number 元,可是我也不多了.<br>";
    	}
        else
        {
    		echo "我无法借 $number 元给你,我没有这么多钱<br>";
    	}
    }    
}
$you = new You();
$you->loan(300); //第一次借钱
$you->loan(600); //第二次借钱
$you->loan(500); //第三次借钱
//你不能知道我钱包里面的钱数,那是我的隐私.
echo $you->youMoney; //这个语句会出现异常.似有变量不能被外界访问.
?>

程序运行结果如下:

好,这里借给你 300 元,可是我也不多了.
好,这里借给你 600 元,可是我也不多了.
我无法借 500 元给你,我没有这么多钱
Fatal error: Cannot access private property You::$youMoney in E:\PHPProjects\test.php on line 28

protected的访问权限

protected 修饰的属性和方法只能被子类调用。外界无法调用。

<!--protected 演示
protected 修饰的属性和方法只能被子类调用.--> <? class You { protected $youMoney = 1000; //借出钱的方法 public function loan($number){ if($this->youMoney >= $number){ $this->youMoney = $this->youMoney - $number; echo "好,这里借给你 $number 元,可是我也不多了.<br>"; }else{ echo "我无法借 $number 元给你,我没有这么多钱<br>"; } } } // 继承后的类可以方法父类的protected属性. class YouSelf extends You { public function getMoney(){ return $this->youMoney; } } $youSelf = new YouSelf(); $youSelf->loan(900); //借钱 echo "老婆,这里我还有.. ".$youSelf->getMoney()." 元"; //其他人就不允许问我了. //echo youSelf->youMoney; //这个语句会出现异常.似有变量不能被外界访问. ?>

程序运行结果如下:

好,这里借给你 900 元,可是我也不多了.
老婆,这里我还有.. 100 元

public的访问权限

数据的隐藏和封装是能够帮助我们保护数据的安全性。

Public 修饰的属性和方法,可以被无限制的调用。

嘿。。你的钱,不安全了。

<?
class You {
	public  $youMoney = 1000;
	//借出钱的方法
    public function loan($number)
	{ 
    	if($this->youMoney >= $number)
		{
    	    $this->youMoney = $this->youMoney - $number;
    	    echo "好,这里借给你 $number 元,可是我也不多了.<br>";
    	}
		else
		{
    		echo "我无法借 $number 元给你,我没有这么多钱<br>";
    	}
    }    
}
$you = new You();
// 不用借钱,想拿就拿吧.
$you->youMoney = $you->youMoney - 5000;
echo "我现在只有".$you->youMoney;
echo "<br>钱哪里去了我也不知道.";
// 数据危险的太多了,通过封装可以保护数据.
?>

程序运行结果如下:

我现在只有-4000
钱哪里去了我也不知道.

延伸阅读

此文章所在专题列表如下:

  1. PHP面向对象之旅:类和对象
  2. PHP面向对象之旅:类的属性
  3. PHP面向对象之旅:类的方法
  4. PHP面向对象之旅:对象的比较
  5. PHP面向对象之旅:构造函数
  6. PHP面向对象之旅:类的继承
  7. PHP面向对象之旅:访问控制
  8. PHP面向对象之旅:方法覆盖
  9. PHP面向对象之旅:this关键字
  10. PHP面向对象之旅:parent::关键字
  11. PHP面向对象之旅:再谈重载
  12. PHP面向对象之旅:获取用户数据
  13. PHP面向对象之旅:用户权限管理类
  14. PHP面向对象之旅:static变量与方法
  15. PHP面向对象之旅:单例模式
  16. PHP面向对象之旅:final类和方法
  17. PHP面向对象之旅:PHP中的常量
  18. PHP面向对象之旅:抽象类
  19. PHP面向对象之旅:抽象方法
  20. PHP面向对象之旅:抽象类继承抽象类
  21. PHP面向对象之旅:静态抽象方法
  22. PHP面向对象之旅:模板模式
  23. PHP面向对象之旅:接口与抽象方法
  24. PHP面向对象之旅:接口的实现
  25. PHP面向对象之旅:接口的继承
  26. PHP面向对象之旅:类型提示
  27. PHP面向对象之旅:PHP的多态
  28. PHP面向对象之旅:instanceof运算符
  29. PHP面向对象之旅:接口与组合模拟多继承
  30. PHP面向对象之旅:一个接口实例
  31. PHP面向对象之旅:简单工厂模式

本文地址:http://www.nowamagic.net/librarys/veda/detail/1088,欢迎访问原出处。

不打个分吗?

转载随意,但请带上本文地址:

http://www.nowamagic.net/librarys/veda/detail/1088

如果你认为这篇文章值得更多人阅读,欢迎使用下面的分享功能。
小提示:您可以按快捷键 Ctrl + D,或点此 加入收藏

大家都在看

阅读一百本计算机著作吧,少年

很多人觉得自己技术进步很慢,学习效率低,我觉得一个重要原因是看的书少了。多少是多呢?起码得看3、4、5、6米吧。给个具体的数量,那就100本书吧。很多人知识结构不好而且不系统,因为在特定领域有一个足够量的知识量+足够良好的知识结构,系统化以后就足以应对大量未曾遇到过的问题。

奉劝自学者:构建特定领域的知识结构体系的路径中再也没有比学习该专业的专业课程更好的了。如果我的知识结构体系足以囊括面试官的大部分甚至吞并他的知识结构体系的话,读到他言语中的一个词我们就已经知道他要表达什么,我们可以让他坐“上位”毕竟他是面试官,但是在知识结构体系以及心理上我们就居高临下。

所以,阅读一百本计算机著作吧,少年!

《深入理解计算机系统(原书第2版)》 布莱恩特(Randal E.Bryant) (作者), 奥哈拉伦(David R.O'Hallaron) (作者), 龚奕利 (译者), 雷迎春 (译者)

《深入理解计算机系统》从程序员的视角详细阐述计算机系统的本质概念,并展示这些概念如何实实在在地影响应用程序的正确性、性能和实用性。全书共12章,主要内容包括信息的表示和处理、程序的机器级表示、处理器体系结构、优化程序性能、存储器层次结构、链接、异常控制流、虚拟存储器、系统级I/O、网络编程、并发编程等。书中提供子大量的例子和练习题,并给出部分答案,有助于读者加深对正文所述概念和知识的理解。

更多计算机宝库...