類的封裝就是把一些相關的屬性和行為隱藏起來, 從而得到保護和安全。
常用關鍵字:
public表示全域, 該類內部及外部子類都可以使用
protected表示受保護的, 只有本類或子類或父類中可以訪問, 可以繼承
private表示私有的, 只有本類內部可以使用, 不能繼承
例:
class myClass
{
public $name;//定義全域屬性
protected $price;//定義受保護的屬性
private function vod()//定義私有方法
{
return $this->name;
}
}
7.1.1 封裝相關函數
__set()與__get()用以某些特定操作時候需要獲取或向被封裝的屬性賦值或進行方法操作。
__set()取得當前類中封裝過的私有屬性或者方法重新執行或賦值操作。
格式:__set(對象名的別名,對應的新值);
__get()取得當前類中封裝過屬性或方法並轉換成共有屬性
格式:__get();
例1:
class myClass
{
public $name;//定義全域屬性
protected $price;//定義受保護的屬性
private function vod($name=””)//定義私有方法
{
return “你好”;
}
function ok()
{
return $this->vod();
}
}
$my1=new myClass(“我的電腦”);
echo $my1->name;//正確
echo $my1->$price;//出錯
echo $my1->vod();//出錯
echo $my1->ok();//正確
例2:對私有屬性的引用
class myClass
{
private $name;//定義私有屬性
function __construct($name=””)
{
$this->name=$name;
}
function __get($name)
{
return “=====”.$this->name.”=====”;//這樣,就可以引用name屬性了,返回的值會被加上多個=, 但其原有值保持不變
}
}
$my1=new myClass(“我的電腦”);
echo $my1->name;//正確
輸出結果:=====我的電腦=====
例3:對私有屬性賦值並引用
class myClass
{
private $name;//定義私有屬性
function __construct($name=””)
{
$this->name=$name;
}
function __get($name)
{
return “==”.$this->name.”==”;//這樣, 就可以引用name屬性了, 但它的值會被加上多個=, 且原有值保持不變
}
function __set($n,$v)//$n對應下麵賦值時的name, $v則對應賦的值
{
$this->$n->$v;//這樣就修改了屬性name的值
}
}
$my1=new myClass(“我的電腦”);
$my1->name=”你的電腦”;//這樣做原本會出錯, 但由於在定義類時我們使用了__set()將name屬
性進行了設置, 也就不會出錯, 並可以對它進行賦值了。
echo $my1->name;//正確
輸出結果:==你的電腦==
7.2.1 繼承關鍵定:exends
PHP類的繼承, 我們可以理解成共用被繼承類的內容。 PHP中使用extends單一繼承的方法, 請切忌:(非C++多繼承)被繼承的我們稱之為父類(基類), 繼承者稱之為子類(派生類)。
7.2.2 PHP繼承的規則
依次被繼承, Class3擁有Class1、Class2所有的功能和屬性。 注意:在子類中定義方法和屬性時應避免與基類方法和屬性重名。
此例先定義了一個類myPc, 然後又定義了一個myPc的子類home, 這樣home就擁有了myPc類中可以被繼承的屬性和方法。
7.2.3基類方法的重載和基類方法的訪問
因為方法和屬性的繼承是向下繼承, 即派生類繼承基類, 故基類不能使用派生類裡的方法和屬性, 但派生類可以使用基類中的方法和屬性。 當我們在派生類中需要用到基類中的一個方法, 但這個方法又不能完成派生類中所需要的功能時,
class home{
function 方法名稱(){
基類名稱::方法名稱;
新的方法的功能
……
}
類的繼承舉例:
例1:
class Root{ /*定義基類*/
function dayin(){
return “Root print
”;
}
}
class Son extends Root{ /*定義子類*/
function dayin2(){
return “Son print
”;
}
}
$p=new Son(); /*產生實體類Son()*/
echo $p->dayin(); /*使用子類繼承父類的方法dayin()*/
echo $p->dayin2(); /*使用子類中的方法dayin();*/
?>
輸出:輸出:Root print
Son print
例2:
class Root{ /*定義基類*/
function dayin(){
return “Root print
”;
}
}
class Son extends Root{ /*定義子類*/
function dayin2(){
return this->dayin(). “Son print
”;/*引用父類中的方法dayin()並與一個字元串連接後返回*/
}
}
$p=new Son(); /*產生實體類Son()*/
echo $p->dayin2(); /*使用子類中的方法dayin();*/
?>
輸出:Root print
Son print
例3:
class Root{ /*定義基類*/
function dayin(){
return “Root print
”;
}
}
class Son extends Root{ /*定義子類*/
function dayin(){ /*在子類中定義一個與父類方法相同的方法, 即方法重載*/
return Root::dayin(). “Son print
”;/*引用父類中的方法dayin()並與一個字元串連接後返回*/
}
}
$p=new Son(); /*產生實體類Son()*/
echo $p->dayin(); /*使用子類重載父類的方法dayin()*/
?>
輸出:Root print
Son print