封裝的概念
封裝就是把抽象出的資料和對資料的操作封裝在一起,資料被保護在內部,程式的其它部分只有通過被授權的操作(成員方法),才能對資料進行操作。
例:在人這個類中,人的年齡和工資是隱私的
<?php
class Person{
public $name;
private $age;
private $salary;
function __construct($name,$age,$salary){
$this->name=$name;
$this->age=$name;
$this->salary=$salary;
}
}
//建立一個人
$p1=new Person("張三",30,1000);
//訪問張三的工資
//echo $p1->salary; //會報錯,不能訪問private中的屬性
echo $p1->name;
?>
封裝的存取修飾詞
php提供三種存取控制修飾符號來控制方法和變數(屬性)的存取權限
public 表示全域,類的外部、內部和子類都可以訪問。
protected 表示受保護的,只有本類或子類可以訪問;
private 表示私人的,只有本類內部可以使用;
這三個修飾符號可以修飾變數和方法。
1) 如果一個方法沒有存取修飾詞,預設是public的。
2)屬性(變數)必須指定存取修飾詞。
3)方法之間可以相互調用,但需要$->this引用。
如下表:
| |
public |
protected |
private |
| 全域 |
√ |
X |
X |
| 繼承類 |
√ |
√ |
X |
| 本類 |
√ |
√ |
√ |
例:
<?php
class Person{
public $name;
protected $age;
private $salary;
function __construct($name,$age,$salary){
$this->name=$name;
$this->age=$name;
$this->salary=$salary;
}
function showInfo(){
//在本類中可以使用public,protected和private類型的值
echo $this->name."||".$this->age."||".$this->salary."<br />";
}
}
//建立一個人
$p1=new Person("張三",30,1000);
//訪問張三的工資
//echo $p1->salary; //會報錯,不能訪問private中的屬性
echo $p1->name."<br />";
$p1->showInfo();
//echo $p1->age;//報錯,因為$age是protected的,類外不能訪問
//echo $p1->salary; //報錯,因為$salary是private的,類外不能訪問
?>
如何訪問protected和private修飾的成員變數?通常是在類中通過public的函數去訪問這些變數。也可以使用php提供的方法
__set();和__get();這兩種方法也被稱為魔術方法。注意:目前已經不推薦使用魔術方法了。
__set()對protected或private屬性進行賦值操作,例:
__set($name,$value);
__get()擷取protected或private屬性的值,例:
__get($name);
例:
<?php
class A{
private $n1;
private $n2;
private $n3;
//使用__set方法來管理所有私人屬性
public function __set($pro_name,$pro_val){
$this->pro_name=$pro_val;
}
//使用__get方法來管理所有私人屬性的值
public function __get($pro_name){
if(isset($pro_name)){
return $this->pro_name;
}else{
return null;
}
}
}
$a1=new A();
$a1->n1="www.bianceng.cn";
echo $a1->n1; //輸出www.bianceng.cn
?>
通常是在類中通過public的函數去訪問protected和private修飾的成員變數
例:
<?php
class Person{
public $name;
protected $age;
private $salary;
function __construct($name,$age,$salary){
$this->name=$name;
$this->age=$name;
$this->salary=$salary;
}
function showInfo(){
//在本類中可以使用public,protected和private類型的值
echo $this->name."||".$this->age."||".$this->salary."<br />";
}
//我們可以通過public的函數來訪問protected或private的變數
function getSalary($user,$pass){
if($user=="www.bianceng.cn" && $pass==123){
return $this->salary;
}else{
echo "你沒有查看工資的許可權";
}
}
}
//建立一個人
$p1=new Person("張三",30,1000);
//訪問張三的工資
//echo $p1->salary; //會報錯,不能訪問private中的屬性
echo $p1->name."<br />";
$p1->showInfo();
//echo $p1->age;//報錯,因為$age是protected的,類外不能訪問
//echo $p1->salary; //報錯,因為$salary是private的,類外不能訪問
echo $p1->getSalary("www.bianceng.cn",123);
?>
例:修改和查看上例中被protected的age
<?php
class Person{
public $name;
protected $age;
private $salary;
function __construct($name,$age,$salary){
$this->name=$name;
$this->age=$name;
$this->salary=$salary;
}
function showInfo(){
//在本類中可以使用public,protected和private類型的值
echo $this->name."||".$this->age."||".$this->salary."<br />";
}
//我們可以通過public的方法來訪問protected或private的變數
function getSalary($user,$pass){
if($user=="www.bianceng.cn" && $pass==123){
return $this->salary;
}else{
echo "你沒有查看工資的許可權";
}
}
//修改年齡
public function setAge($age){
if($age>=1 && $age<=120){
$this->age=$age;
}else{
echo "<br />年齡範圍不對!<br />";
}
}
//查看年齡
public function getAge(){
return $this->age;
}
}
//建立一個人
$p1=new Person("張三",30,1000);
//訪問張三的工資
//echo $p1->salary; //會報錯,不能訪問private中的屬性
echo $p1->name."<br />";
$p1->showInfo();
//echo $p1->age;//報錯,因為$age是protected的,類外不能訪問
//echo $p1->salary; //報錯,因為$salary是private的,類外不能訪問
echo $p1->getSalary("www.bianceng.cn",1203);
//修改年齡
$p1->setAge(75);
echo "<br />".$p1->getAge();
?>