- <?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的,任何地方都可以訪問).
新聞熱點
疑難解答