PHP 對屬性或方法的訪問控制,是通過在前面添加關(guān)鍵字 public(公有),protected(受保護(hù))或 private(私有)來實(shí)現(xiàn)的。
- public(公有):公有的類成員可以在任何地方被訪問。
- protected(受保護(hù)):受保護(hù)的類成員則可以被其自身以及其子類和父類訪問。
- private(私有):私有的類成員則只能被其定義所在的類訪問。
在子類中,可以對 public(公有)和protected(受保護(hù))進(jìn)行重定義,但private(私有)而不能
屬性的訪問控制
類屬性必須定義為公有,受保護(hù),私有之一。
如果用 var 定義,則被視為公有。
<?php
/**
* Define MyClass
*/
class MyClass
{
public $public = 'Public';
protected $protected = 'Protected';
private $private = 'Private';
function printHello()
{
echo $this->public;
echo $this->protected;
echo $this->private;
}
}
$obj = new MyClass();
echo $obj->public; // 這行能被正常執(zhí)行
echo $obj->protected; // 這行會產(chǎn)生一個致命錯誤
echo $obj->private; // 這行也會產(chǎn)生一個致命錯誤
$obj->printHello(); // 輸出 Public、Protected 和 Private
/**
* Define MyClass2
*/
class MyClass2 extends MyClass
{
// 可以對 public 和 protected 進(jìn)行重定義,但 private 而不能
protected $protected = 'Protected2';
function printHello()
{
echo $this->public;
echo $this->protected;
echo $this->private;
}
}
$obj2 = new MyClass2();
echo $obj2->public; // 這行能被正常執(zhí)行
echo $obj2->private; // 未定義 private,私有的類成員則只能被其定義所在的類訪問
echo $obj2->protected; // 這行會產(chǎn)生一個致命錯誤
$obj2->printHello(); // 輸出 Public、Protected2 和 Undefined
?>
注意,什么是類,什么是對象(類的實(shí)例)
方法的訪問控制
類中的方法可以被定義為公有,私有或受保護(hù)。
如果沒有設(shè)置這些關(guān)鍵字,則該方法默認(rèn)為公有。
<?php
/**
* Define MyClass
*/
class MyClass
{
// 聲明一個公有的構(gòu)造函數(shù)
public function __construct() { }
// 聲明一個公有的方法
public function MyPublic() { }
// 聲明一個受保護(hù)的方法
protected function MyProtected() { }
// 聲明一個私有的方法
private function MyPrivate() { }
// 此方法為公有
function Foo()
{
$this->MyPublic();
$this->MyProtected();
$this->MyPrivate();
}
}
$myclass = new MyClass;
$myclass->MyPublic(); // 這行能被正常執(zhí)行
$myclass->MyProtected(); // 這行會產(chǎn)生一個致命錯誤
$myclass->MyPrivate(); // 這行會產(chǎn)生一個致命錯誤
$myclass->Foo(); // 公有,受保護(hù),私有都可以執(zhí)行
/**
* Define MyClass2
*/
class MyClass2 extends MyClass
{
// 此方法為公有
function Foo2()
{
$this->MyPublic();
$this->MyProtected();
$this->MyPrivate(); // 這行會產(chǎn)生一個致命錯誤
}
}
$myclass2 = new MyClass2;
$myclass2->MyPublic(); // 這行能被正常執(zhí)行
$myclass2->Foo2(); // 公有的和受保護(hù)的都可執(zhí)行,但私有的不行
class Bar
{
public function test() {
$this->testPrivate();
$this->testPublic();
}
public function testPublic() {
echo "Bar::testPublicn";
}
private function testPrivate() {
echo "Bar::testPrivaten";
}
}
class Foo extends Bar
{
public function testPublic() {
echo "Foo::testPublicn";
}
private function testPrivate() {
echo "Foo::testPrivaten";
}
}
$myFoo = new foo();
$myFoo->test(); // Bar::testPrivate
// Foo::testPublic
?>