封裝就是把抽象出的數據和對數據的操作封裝在一起,數據被保護在內部,程序的其它部分只有通過被授權的操作(成員方法),才能對數據進行操作。
例:在人這個類中,人的年齡和工資是隱私的
<?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的,類外不能訪問
?>
__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
?>
例:
<?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);
?>
<?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();
?>
URL:http://www.bianceng.cn/webkf/PHP/201610/50461.htm