首页 > 语言 > PHP > 正文

php面向对象的封装性说明

2024-09-04 11:43:39
字体:
来源:转载
供稿:网友
  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.  
  47.   //x封装成员属性,不需要在对象外部改变 
  48.   private $name
  49.   private $age
  50.   private $sex
  51.  
  52.  
  53.   private __unset($proName){ 
  54.    unset($this->$proName); 
  55.    
  56.   } 
  57.  
  58.  
  59.   //是直接查看对象中私有属性是否存在时,自动调用这个方法 
  60.   //__isset($proName)的使用,$proName代表属性名 
  61.   private function __isset($proName){ 
  62.    return isset($this->$proName);//isset()返回是否存在 
  63.   } 
  64.  
  65.   function __construct($name,$age,$sex){ 
  66.    $this->name=$name
  67.    $this->age=$age
  68.    $this->sex=$sex
  69.  
  70.   } 
  71.  
  72.    
  73.   //当获取私有的成员属性时,自动调用此方法 
  74.   private function __get($proName
  75.   { 
  76.    //控制所获取的值 
  77.    if($proName=="age"){ 
  78.     if($this-age>40) 
  79.      return $this->age-10; 
  80.    } 
  81.    return $this->$proName
  82.   } 
  83.  
  84.   //当设置私有的成员属性时,自动调用此方法 
  85.   private function __set($proName,$proValue){ 
  86.    //$proName表示成员属性名,$proValue表示成员属性值 
  87.    //控制设置范围 
  88.    if($proName=="age"){ 
  89.     if($proValue > 100 || $proValue<0) 
  90.      return
  91.    } 
  92.    $this->$proName=$proValue
  93.  
  94.     
  95.   } 
  96.  
  97.   //提供公有方法来设置成员属性的值 
  98.   function setAge($age){ 
  99.    //控制年龄范围,增加安全性 
  100.    if($age > 100 || $age < 0 ) 
  101.     return
  102.    $this->age=$age
  103.   } 
  104.    
  105.   //提供公有方法来获取成员属性的值 
  106.   function getAge(){ 
  107.    //控制获取年龄的范围 
  108.    if($this->age < 30) 
  109.     return $this->age; 
  110.    else if($this->age<40) 
  111.     return $this->age-5; 
  112.    else if($this->age<50) 
  113.     return $this->age; 
  114.    else 
  115.     return $this->age-15; 
  116. 提供公有方法来  } 
  117.  
  118.   function say(){ 
  119.    echo "我的名字:{$this->name},我的年龄:{$this->age},我的姓别:{$this->sex}<br>"
  120.  
  121.    //访问封装过的 run()方法 
  122.    $this-run(); 
  123.   } 
  124.  
  125.   private function run(){ 
  126.    echo '111111111111<br>' 
  127.  
  128.   } 
  129.  
  130.   function eat(){ 
  131.  
  132.   } 
  133.  
  134.   //析构方法 
  135.   function __destruct(){ 
  136.  
  137.   } 
  138.  } 
  139.  
  140. $p1=new Person("zhangsan",25,"男"); 
  141. $p2=new Person; 
  142. $p3=new Person; 
  143. //$p1->age=-50;//因为年龄在外部随意访问,所以成员属性药封装,才有安全性。 
  144. $p1->setAge(30);//通过方法来设置成员属性德值 
  145. $p1->getAge();//通过方法来获取成员属性德值 
  146.  
  147. //通过添加家魔术方法__set($proName,$proValue) __get($proName),就可以直接调用成员属性了 
  148.  
  149.  
  150. $p1->say();//可以调用 
  151. $p1->run();//私有的方法不能直接调用 
  152.  
  153. //删除$p1里面的name 
  154. unset($p1->name); 
  155.  
  156. //判断name是否存在 
  157. if(isset($p1->name)){ 
  158.  
  159.  echo "存在<br>"
  160. }else
  161.  echo "没有这个成员 <br>"
  162.  
  163.  
  164. 来的成员: 
  165. var $name;                  //声明人的姓名 
  166. var $sex;                            //声明人的性别 
  167. var $age;                            //声明人的年龄 
  168. function run(){…….} 
  169. 改成封装的形式: 
  170. private $name;                            //把人的姓名使用private关键字进行封装 
  171. private $sex;                                     //把人的性别使用private关键字进行封装 
  172. private $age;                                     //把人的年龄使用private关键字进行封装 
  173. private function run(){……}             //把人的走路方法使用private关键字进行封装 
  174. 注意:只要是成员属性前面有其它的关键字就要去掉原有的关键字“var”。 
  175. 通过private就可以把人的成员(成员属性和成员方法)封装上了。封装上的成员就不能被类外面直接访问了,只有对象内部自己可以访问;下面的代码会产生错误: 
  176. class Person 
  177. //下面是人的成员属性 
  178. private $name//人的名子,被private封装上了 
  179. private $sex//人的性别, 被private封装上了 
  180. private $age//人的年龄, 被private封装上了 
  181. //这个人可以说话的方法 
  182. function say() 
  183. echo "我的名子叫:".$this->name." 性别:".$this->sex." 我的年龄是:".$this->age."<br>"
  184. //这个人可以走路的方法, 被private封装上了 
  185. private function run() 
  186. echo "这个人在走路"
  187. //实例化一个人的实例对象 
  188. $p1=new Person(); 
  189. //试图去给私有的属性赋值,结果会发生错误 
  190. $p1->name="张三"
  191. $p1->sex="男"
  192. $p1->age=20; 
  193. //试图去打印私有的属性,结果会发生错误 
  194. echo $p1->name.”<br>”; 
  195. echo $p1->sex.”<br>”; 
  196. echo $p1->age.”<br>” 
  197. //试图去打印私有的成员方法,结果会发生错误 
  198. $p1->run(); 
  199. //输出结果为: 
  200. //Fatal error: Cannot access private property Person::$name 
  201. //Fatal error: Cannot access private property Person::$sex 
  202. //Fatal error: Cannot access private property Person::$age 
  203. //Fatal error: Cannot access private property Person::$name 
  204. //Fatal error: Call to private method Person::run() from context '' 
  205. ?> 

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

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表