php面向对象的封装性说明

  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. 来的成员:
  134. var $name; //声明人的姓名
  135. var $sex; //声明人的性别
  136. var $age; //声明人的年龄
  137. function run(){…….}
  138. 改成封装的形式:
  139. private $name; //把人的姓名使用private关键字进行封装
  140. private $sex; //把人的性别使用private关键字进行封装
  141. private $age; //把人的年龄使用private关键字进行封装
  142. private function run(){……} //把人的走路方法使用private关键字进行封装
  143. 注意:只要是成员属性前面有其它的关键字就要去掉原有的关键字“var”。
  144. 通过private就可以把人的成员(成员属性和成员方法)封装上了。封装上的成员就不能被类外面直接访问了,只有对象内部自己可以访问;下面的代码会产生错误:
  145. class Person
  146. {
  147. //下面是人的成员属性
  148. private $name; //人的名子,被private封装上了
  149. private $sex; //人的性别, 被private封装上了
  150. private $age; //人的年龄, 被private封装上了
  151. //这个人可以说话的方法
  152. function say()
  153. {
  154. echo "我的名子叫:".$this->name." 性别:".$this->sex." 我的年龄是:".$this->age."<br>";
  155. }
  156. //这个人可以走路的方法, 被private封装上了
  157. private function run()
  158. {
  159. echo "这个人在走路";
  160. }
  161. }
  162. //实例化一个人的实例对象
  163. $p1=new Person();
  164. //试图去给私有的属性赋值,结果会发生错误
  165. $p1->name="张三";
  166. $p1->sex="男";
  167. $p1->age=20;
  168. //试图去打印私有的属性,结果会发生错误
  169. echo $p1->name.”<br>”;
  170. echo $p1->sex.”<br>”;
  171. echo $p1->age.”<br>”
  172. //试图去打印私有的成员方法,结果会发生错误
  173. $p1->run();
  174. //输出结果为:
  175. //Fatal error: Cannot access private property Person::$name
  176. //Fatal error: Cannot access private property Person::$sex
  177. //Fatal error: Cannot access private property Person::$age
  178. //Fatal error: Cannot access private property Person::$name
  179. //Fatal error: Call to private method Person::run() from context ''
  180. ?>

从上面的实例可以看到,私有的成员是不能被外部访问的,因为私有成员只能在本对象内部自己访问,比如,$p1这个对象自己想把他的私有属性说出去,在say()这个方法里面访问了私有属性,这样是可以,(没有加任何访问控制,默认的是public的,任何地方都可以访问).