談到封裝大家都會想到另外一個詞就是:信息隱藏(information hiding), 如果一開始讓你理解封裝就直接談信息隱藏並不一定有幫助或者更好的理解,那我們實際上可以先去了解什麼是劃分(compartments)。
Crady Booch給出以下描述:
封裝就是劃分一個抽象的諸多元素的過程,這些元素構成抽象的接口和行爲;封裝的作用就是將抽象的契約接口與其實現分離
一旦把一個複雜的大問題模塊化華爲多個可解決的子問題。就可以利用封裝來得到較小的抽象,並對他們完成劃分(compartmentalizing)。
在PHP中,可見性(visibility)是指對類屬性的訪問或者說是存取也行。PHP使用3種類型的可見性:
private、protected和public 沒錯,分別就是私有、保護和公有;可以採用這些可見性來封裝和訪問程序
1、Private
要封裝一個程序元素.最容易的方法就是設置爲私有(private)\這說明這個屬性只能在 同一個類中訪問,它只對同一個類中的元素可見;
示例:
<?php
//封裝性
//私有private 保護protected 公有public
//要封裝一個程序元素.最容易的方法就是設置爲私有(private)\這說明這個屬性只能在 同一個類中訪問,它只對同一個類中的元素可見,
Class PrivateVis
{
private $money;
public function __construct()
{
$this->money=200;
$this->secret();
}
private function secret()
{
echo $this->money;
}
}
$woker = new PrivateVis();
當然運行的時候會返回200;
首先這個例子構造函數是PrivateVis的一部分,所以它能夠訪問所有私有的屬性和方法;應用同一個類中的屬性和方法PHP要求使用$this ;這個類外部對象只能看到secret()輸出的結果而無法去改變類中的方法和屬性;
2、Protected
如果屬性設置爲私有,只允許同一個類中的元素去訪問這個屬性,protected不同:如果屬性的可見性爲保護,則允許這個類中以及子類都可以訪問該屬性。抽象方法和具體方法的可見性都可以設置爲保護(protected),下面的例子顯示瞭如何使用具有保護可見性的抽象類和具體實現:
<?php
abstract class ProtectedVis
{
abstract protected function countMoney();
protected $wage;
protected function setHourly($hourly)
{
$money = $hourly;
return $hourly;
}
}
子類擴展一個包含方法的抽象類時,對於抽象方法,在使用之前必須先實現這個抽象方法。對於有保護可見性的具體方法,子類可以直接使用,而無需另行實現:
<?php
include_once('ProtectedVis.php');
class ConcreteProtected extends ProtectedVis
{
function __construct()
{
$this->countMoney();
}
protected function countMoney()
{
// TODO: Implement countMoney() method.
$this->wage = "Your Hourly wage is $";
echo $this->wage.$this->setHourly(36);
}
}
$woker = new ConcreteProtected();
注意抽象方法countMoney使用了繼承來的setHourly()方法。繼承的所有屬性和方法都需要使用$this語句。第一訪問保護屬性時,要使用公共構造函數。
儘管封裝性不及私有可見行,但是保護可見性能夠對程序中更大的機構完成封裝。這個更大的結構由父類和他的子類構成
3 、Public
要訪問瘋傳的個對象,必須提供公共可見性。要想左右一個真正有用的類,其中至少要有一些方法就可見的,即使時構造函數。當然所有的構造函數都是公共的。如果你的程序包含一個構造函數,這個類之外的對象就能通過實例化這個類來訪問它。舉例:
<?php
/**
* Create by PhpStorm
* Author : wqzbxh
* Date : 2019/11/27
* time :23:06
*/
class PublicVis
{
private $password;
private function openSesame($someData)
{
$this->password = $someData;
if($this->password = 'secret')
{
echo "You're in<br/>";
}
else
{
echo "Release the hounds!<br/>";
}
}
public function unlock($safe)
{
$this->openSesame($safe);
}
}
$woker = new PublicVis();
$woker->unlock("secret");
$woker->unlock('duh')
通常含有公共方法或者屬性是爲了提供一個途徑,從而可以寫一個沒有構造函數自動啓動對象而保持交流,。在publicVis.php文件中,$password屬性和openSesame屬性都是私有的,unlock方法時公共的,因爲他是PublicVis類的一部分,所以他能夠訪問該類的私有屬性和方法
鏈接:封裝之獲取方法和設置方法