国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > 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的,任何地方都可以訪問).

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 南川市| 横山县| 武宁县| 陆良县| 嫩江县| 罗甸县| 青神县| 珠海市| 贡山| 康保县| 康定县| 千阳县| 临漳县| 伊吾县| 高州市| 清苑县| 嵩明县| 门源| 昆明市| 兴宁市| 内江市| 宁明县| 兴安县| 沂南县| 神木县| 五华县| 平遥县| 墨玉县| 鄂尔多斯市| 肥乡县| 界首市| 建水县| 静安区| 南岸区| 内江市| 伊川县| 松阳县| 沙田区| 延津县| 盐池县| 婺源县|