php物件導向的封裝性說明

來源:互聯網
上載者:User

<?php教程
/*
 * 封裝性:物件導向三大特性之一
 *
 * 1.就是把對象的成員(屬性,方法)結合成一個獨立的相同單位,並儘可能隱藏對象的內部細節
 *   存取權限修飾符  public protected private
 *   private:私人的,用這個關鍵字修飾的成員,只能在對象內部訪問(只有用$this訪問)
 * 
 *  屬性可以封裝:
 *    只要一個變數,需要在多個方法使用,就將這個變數聲明為成員屬性,可以直接在這個對象中的所有方法中使用
 *
 *    成員屬性,相當於這個對象中的全域變數
 *
 *    成員屬性都會在方法中使用,成員屬性值的變化其實就是在改變方法的執行行為,也就是改變了對象的功能
 *
 *    成員屬性的值如果不正常,方法執行的功能葉就不正常
 *    
 *    作用:不需要在對象外部改變或讀取它的值
 *     1.封裝
 *      再提供一個公有的方法(經過方法對對象成員屬性進行賦值和取值就可以控制)
 *
 *
 *  方法也可以封裝
 *
 *   作用:
 *    1.使用private修飾使其只能在內部使用
 *
 *    2.一個類中有100個方法,封裝了95個(為另外5個服務的方法),只有5個方法可以使用
 *
 *   100個成員屬性,都讓取值,不可以改值;或者只可改值,不可擷取值//此種情況下使用以下方法比較方便
 *   和封裝有關的魔術方法:
 *
 *  __set();//是直接設定[私人的]成員屬性值時,自動調用的方法
 *  __get();//是直接擷取[私人的]成員屬性值時,自動調用的方法
 *  __isset();//是直接使用isset()查看對象中私人屬性是否存在時,自動調用這個方法
 *  __unset();//是直接使用unset()刪除對象中私人屬性時,自動調用的方法
 *
 *
 *
 *
 *
 *
 *
 */
class Person{

  //x封裝成員屬性,不需要在對象外部改變
  private $name;
  private $age;
  private $sex;


  private __unset($proName){
   unset($this->$proName);
  
  }


  //是直接查看對象中私人屬性是否存在時,自動調用這個方法
  //__isset($proName)的使用,$proName代表屬性名稱
  private function __isset($proName){
   return isset($this->$proName);//isset()返回是否存在
  }

  function __construct($name,$age,$sex){
   $this->name=$name;
   $this->age=$age;
   $this->sex=$sex;

  }

  
  //當擷取私人的成員屬性時,自動調用此方法
  private function __get($proName)
  {
   //控制所擷取的值
   if($proName=="age"){
    if($this-age>40)
     return $this->age-10;
   }
   return $this->$proName;
  }

  //當設定私人的成員屬性時,自動調用此方法
  private function __set($proName,$proValue){
   //$proName表示成員屬性名,$proValue表示成員屬性值
   //控制設定範圍
   if($proName=="age"){
    if($proValue > 100 || $proValue<0)
     return;
   }
   $this->$proName=$proValue;

   
  }

  //提供公有方法來設定成員屬性的值
  function setAge($age){
   //控制年齡範圍,增加安全性
   if($age > 100 || $age < 0 )
    return;
   $this->age=$age;
  }
  
  //提供公有方法來擷取成員屬性的值
  function getAge(){
   //控制擷取年齡的範圍
   if($this->age < 30)
    return $this->age;
   else if($this->age<40)
    return $this->age-5;
   else if($this->age<50)
    return $this->age;
   else
    return $this->age-15;
提供公有方法來  }

  function say(){
   echo "我的名字:{$this->name},我的年齡:{$this->age},我的姓別:{$this->sex}<br>";

   //訪問封裝過的 run()方法
   $this-run();
  }

  private function run(){
   echo '111111111111<br>'

  }

  function eat(){

  }

  //析構方法
  function __destruct(){

  }
 }

$p1=new Person("zhangsan",25,"男");
$p2=new Person;
$p3=new Person;
//$p1->age=-50;//因為年齡在外部隨意訪問,所以成員屬性藥封裝,才有安全性。
$p1->setAge(30);//通過方法來設定成員屬性德值
$p1->getAge();//通過方法來擷取成員屬性德值

//通過添加家魔術方法__set($proName,$proValue) __get($proName),就可以直接調用成員屬性了


$p1->say();//可以調用
$p1->run();//私人的方法不能直接調用

//刪除$p1裡面的name
unset($p1->name);

//判斷name是否存在
if(isset($p1->name)){

 echo "存在<br>";
}else{
 echo "沒有這個成員 <br>";
}


來的成員:
var $name;                  //聲明人的姓名
var $sex;                            //聲明人的性別
var $age;                            //聲明人的年齡
function run(){…….}
改成封裝的形式:
private $name;                            //把人的姓名使用private關鍵字進行封裝
private $sex;                                     //把人的性別使用private關鍵字進行封裝
private $age;                                     //把人的年齡使用private關鍵字進行封裝
private function run(){……}             //把人的走路方法使用private關鍵字進行封裝
注意:只要是成員屬性前面有其它的關鍵字就要去掉原有的關鍵字“var”。
通過private就可以把人的成員(成員屬性和成員方法)封裝上了。封裝上的成員就不能被類外面直接存取了,只有對象內部自己可以訪問;下面的代碼會產生錯誤:
class Person
{
//下面是人的成員屬性
private $name; //人的名子,被private封裝上了
private $sex; //人的性別, 被private封裝上了
private $age; //人的年齡, 被private封裝上了
//這個人可以說話的方法
function say()
{
echo "我的名子叫:".$this->name." 性別:".$this->sex." 我的年齡是:".$this->age."<br>";
}
//這個人可以走路的方法, 被private封裝上了
private function run()
{
echo "這個人在走路";
}
}
//執行個體化一個人的執行個體對象
$p1=new Person();
//試圖去給私人的屬性賦值,結果會發生錯誤
$p1->name="張三";
$p1->sex="男";
$p1->age=20;
//試圖去列印私人的屬性,結果會發生錯誤
echo $p1->name.”<br>”;
echo $p1->sex.”<br>”;
echo $p1->age.”<br>”
//試圖去列印私人的成員方法,結果會發生錯誤
$p1->run();
輸出結果為:
Fatal error: Cannot access private property Person::$name
Fatal error: Cannot access private property Person::$sex
Fatal error: Cannot access private property Person::$age
Fatal error: Cannot access private property Person::$name
Fatal error: Call to private method Person::run() from context ''
從上面的執行個體可以看到,私人的成員是不能被外部存取的,因為私人成員只能在本對象內部自己訪問,比如,$p1這個對象自己想把他的私人屬性說出去,在say()這個方法裡面訪問了私人屬性,這樣是可以。(沒有加任何存取控制,預設的是public的,任何地方都可以訪問)

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.