php物件導向編程的封裝性

來源:互聯網
上載者:User

封裝的概念

封裝就是把抽象出的資料和對資料的操作封裝在一起,資料被保護在內部,程式的其它部分只有通過被授權的操作(成員方法),才能對資料進行操作。

例:在人這個類中,人的年齡和工資是隱私的

<?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();
?>

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.