php物件導向全攻略 (九)訪問類型

來源:互聯網
上載者:User

13.訪問類型
類型的存取修飾詞允許開發人員對類成員的訪問進行限制,這是PHP5 的新特性,但卻
是OOP 語言的一個好的特性。而且大多數OOP 語言都已支援此特性。PHP5 支援如下3 種訪
問修飾符
public (公有的、預設的),private (私人的)和protected (受保護的)三種。
public 公有修飾符,類中的成員將沒有訪問限制,所有的外部成員都可以訪問(讀和寫)
這個類成員(包括成員屬性和成員方法),在PHP5 之前的所有版本中,PHP 中類的成員都是
public 的,而且在PHP5 中如果類的成員沒有指定成員存取修飾詞,將被視為public。
例:public $name;
public function say(){};
private 私人修改符,被定義為private 的成員,對於同一個類裡的所有成員是可見的,即
是沒有訪問限制;但對於該類的外部代碼是不允許改變甚至讀操作,對於該類的子類,也不
能訪問private 修飾的成員。
例:private $var1 = ‘A'; //屬性
private function getValue(){} //函數
protected 保護成員修飾符,被修飾為protected 的成員不能被該類的外部代碼訪問。但是
對於該類的子類有存取權限,可以進行屬性、方法的讀及寫操作,該子類的外部程式碼封裝括其的
子類都不具有訪問其屬性和方法的許可權。
例:protected $name;
protected function say(){};
private protected public
同一個類中 √ √ √
類的子類中 √ √
所有的外部成員 √
程式碼片段 複製代碼 代碼如下:<?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; //Works
echo $obj->protected; // Fatal Error
echo $obj->private; // Fatal Error
$obj->printHello(); // Shows Public, Protected and Private
/**
* Define MyClass2
*/
class MyClass2 extends MyClass{
//We can redeclare the public and protected method, but not private
protected $protected = 'Protected2';
function printHello(){
echo $this->public;
echo $this->protected;
echo $this->private;
}
}
$obj2 = new MyClass2();
echo $obj->public; //Works
echo $obj2->private; // Undefined
echo $obj2->protected; // Fatal Error
$obj2->printHello(); // Shows Public, Protected2, not Private
?>

程式碼片段 複製代碼 代碼如下:<?php
/**
* Define MyClass
*/
class MyClass{
// Contructors must be public
public function __construct() { }
// Declare a public method
public function MyPublic() { }
// Declare a protected method
protected function MyProtected() { }
// Declare a private method
private function MyPrivate() { }
// This is public
function Foo() {
$this->MyPublic();
$this->MyProtected();
$this->MyPrivate();
}
}
$myclass = new MyClass;
$myclass->MyPublic(); //Works
$myclass->MyProtected(); // Fatal Error
$myclass->MyPrivate(); // Fatal Error
$myclass->Foo(); // Public, Protected and Private work
/**
* Define MyClass2
*/
class MyClass2 extends MyClass{
// This is public
function Foo2(){
$this->MyPublic();
$this->MyProtected();
$this->MyPrivate(); // Fatal Error
}
}
$myclass2 = new MyClass2;
$myclass2->MyPublic(); // Works
$myclass2->Foo2(); // Public and Protected work, not Private
?>

另外在子類覆蓋父類的方法時也要注意一點,子類中方法的存取權限一定不能低於父類
被覆蓋方法的存取權限,也就是一定要高於或等於父類方法的存取權限。
例如,如果父類方法的存取權限是protected 那麼子類中要覆蓋的許可權就要是protected
和public,如果父類的方法是public 那麼子類中要覆蓋的方法只能也是public,總之子類中的
方法總是要高於或等於父類被覆蓋方法的存取權限。

相關文章

聯繫我們

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