Discuz教程网

php中面向对象三大特性之一[封装性]的应用

[复制链接]
authicon 星火燎原 发表于 2011-6-16 20:55:22 | 显示全部楼层 |阅读模式
就是把对象的成员(属性,方法)结合成一个独立的相同单位,并尽可能隐藏对象的内部细节
代码如下:

  1. <?php
  2. /*
  3. * 封装性:面向对象三大特性之一
  4. *
  5. * 1.就是把对象的成员(属性,方法)结合成一个独立的相同单位,并尽可能隐藏对象的内部细节
  6. * 访问权限修饰符 public protected private
  7. * private:私有的,用这个关键字修饰的成员,只能在对象内部访问(只有用$this访问)
  8. *
  9. * 属性可以封装:
  10. * 只要一个变量,需要在多个方法使用,就将这个变量声明为成员属性,可以直接在这个对象中的所有方法中使用
  11. *
  12. * 成员属性,相当于这个对象中的全局变量
  13. *
  14. * 成员属性都会在方法中使用,成员属性值的变化其实就是在改变方法的执行行为,也就是改变了对象的功能
  15. *
  16. * 成员属性的值如果不正常,方法执行的功能叶就不正常
  17. *
  18. * 作用:不需要在对象外部改变或读取它的值
  19. * 1.封装
  20. * 再提供一个公有的方法(经过方法对对象成员属性进行赋值和取值就可以控制)
  21. *
  22. *
  23. * 方法也可以封装
  24. *
  25. * 作用:
  26. * 1.使用private修饰使其只能在内部使用
  27. *
  28. * 2.一个类中有100个方法,封装了95个(为另外5个服务的方法),只有5个方法可以使用
  29. *
  30. * 100个成员属性,都让取值,不可以改值;或者只可改值,不可获取值//此种情况下使用以下方法比较方便
  31. * 和封装有关的魔术方法:
  32. *
  33. * __set();//是直接设置[私有的]成员属性值时,自动调用的方法
  34. * __get();//是直接获取[私有的]成员属性值时,自动调用的方法
  35. * __isset();//是直接使用isset()查看对象中私有属性是否存在时,自动调用这个方法
  36. * __unset();//是直接使用unset()删除对象中私有属性时,自动调用的方法
  37. *
  38. *
  39. *
  40. *
  41. *
  42. *
  43. *
  44. */
  45. class Person{
  46. //x封装成员属性,不需要在对象外部改变
  47. private $name;
  48. private $age;
  49. private $sex;
  50. private __unset($proName){
  51. unset($this->$proName);
  52. }
  53. //是直接查看对象中私有属性是否存在时,自动调用这个方法
  54. //__isset($proName)的使用,$proName代表属性名
  55. private function __isset($proName){
  56. return isset($this->$proName);//isset()返回是否存在
  57. }
  58. function __construct($name,$age,$sex){
  59. $this->name=$name;
  60. $this->age=$age;
  61. $this->sex=$sex;
  62. }
  63. //当获取私有的成员属性时,自动调用此方法
  64. private function __get($proName)
  65. {
  66. //控制所获取的值
  67. if($proName=="age"){
  68. if($this-age>40)
  69. return $this->age-10;
  70. }
  71. return $this->$proName;
  72. }
  73. //当设置私有的成员属性时,自动调用此方法
  74. private function __set($proName,$proValue){
  75. //$proName表示成员属性名,$proValue表示成员属性值
  76. //控制设置范围
  77. if($proName=="age"){
  78. if($proValue > 100 || $proValue<0)
  79. return;
  80. }
  81. $this->$proName=$proValue;
  82. }
  83. //提供公有方法来设置成员属性的值
  84. function setAge($age){
  85. //控制年龄范围,增加安全性
  86. if($age > 100 || $age < 0 )
  87. return;
  88. $this->age=$age;
  89. }
  90. //提供公有方法来获取成员属性的值
  91. function getAge(){
  92. //控制获取年龄的范围
  93. if($this->age < 30)
  94. return $this->age;
  95. else if($this->age<40)
  96. return $this->age-5;
  97. else if($this->age<50)
  98. return $this->age;
  99. else
  100. return $this->age-15;
  101. 提供公有方法来 }
  102. function say(){
  103. echo "我的名字:{$this->name},我的年龄:{$this->age},我的姓别:{$this->sex}<br>";
  104. //访问封装过的 run()方法
  105. $this-run();
  106. }
  107. private function run(){
  108. echo '111111111111<br>'
  109. }
  110. function eat(){
  111. }
  112. //析构方法
  113. function __destruct(){
  114. }
  115. }
  116. $p1=new Person("zhangsan",25,"男");
  117. $p2=new Person;
  118. $p3=new Person;
  119. //$p1->age=-50;//因为年龄在外部随意访问,所以成员属性药封装,才有安全性。
  120. $p1->setAge(30);//通过方法来设置成员属性德值
  121. $p1->getAge();//通过方法来获取成员属性德值
  122. //通过添加家魔术方法__set($proName,$proValue) __get($proName),就可以直接调用成员属性了
  123. $p1->say();//可以调用
  124. $p1->run();//私有的方法不能直接调用
  125. //删除$p1里面的name
  126. unset($p1->name);
  127. //判断name是否存在
  128. if(isset($p1->name)){
  129. echo "存在<br>";
  130. }else{
  131. echo "没有这个成员 <br>";
  132. }
  133. ?>
复制代码




作者:代号极光
出处:http://zizhuyuan.cnblogs.com





上一篇:Discuz X2新人报道插件
下一篇:php zend解密软件绿色版测试可用
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

1314学习网 ( 浙ICP备10214163号 )

GMT+8, 2025-5-2 05:01

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表