2011-04-08 130 views
5

我對這段關於PHP中的OO可見性有點困惑。我很好奇,如果有人能夠向我解釋。例子會很棒!我的大腦思維不清晰。php面向對象的可見性

http://www.php.net/manual/en/language.oop5.visibility.php

第一款讀取

的屬性或方法 的知名度可以通過在前面的 聲明與公衆的關鍵字, 保護或私有定義。隨處可見 宣佈公開的類成員 。 委員聲稱:保護 只能在類 本身和繼承和父 類訪問。聲明爲私人的成員 只能由 定義成員的類訪問。

怎一個父類訪問孩子的類成員?

回答

5

這就是如何:

class A { 
    public function test() { 
     $b = new B; 
     echo $b->foo; 
    } 
} 

class B extends A { 
    protected $foo = 'bar'; 
} 

$a = new A; 
$a->test(); 
+1

看起來真的錯了。怪不得PHP總是用醜陋的棍子塗上;-) – Phil 2011-04-08 02:11:06

+0

@Phil是的,這種模式是否被推薦是另一回事...... ;-) – deceze 2011-04-08 02:16:33

+0

這真棒!哈哈 – Sufendy 2011-04-08 03:13:41

1

PHP是一種解釋型語言。屬性在運行時解決,而不是在編譯階段。訪問修飾符僅在訪問屬性時進行檢查。

這沒有什麼區別,如果你的ad-hoc所以它成爲公共注入新的(未申報)的財產,或者如果你在繼承的類聲明的保護特性。

private真的隻影響來自外部的可訪問性。無論如何,在運行時解析的->name工作。如果對當前對象實例類進行了屬性聲明,PHP運行時不會推進。 (不同於用於私人聲明。)

1

公共範圍:屬性(方法,變量等)可以從任何文件中的任何類訪問。

class Example { 
    public $foo; 
} 

$example = new Example; 
$example->foo = 3; // everything OK 

private scope:property只能由同一個類訪問。

class Example { 
    private $foo; 
} 

class Child_Class extends Example { 

    public function some_method() 
    { 
     parent::foo = 3; // raises error 
    } 
} 

受保護的範圍:屬性只能由相同的類或其它擴展它的類來訪問。

class Example { 
    protected $foo; 
} 

class Child_Class extends Example { 

    public function some_method() 
    { 
     parent::foo = 3; // this is OK 
    } 
} 

這一切都與一個名爲技術封裝,在你不能讓一個類成員的狀態或行爲給類以外的被改變的事情。 http://en.wikipedia.org/wiki/Encapsulation_(object-oriented_programming)