# 關於 private 的 visibility - 以 PHP 為範例 ###### tags: `PHP` `OOP` `Coding Tips` {%hackmd theme-dark %} Private 的 visibility 只限於被宣告的那個 class。換句話說,除了外部以外,那些繼承了這個 class 的 subclass 一樣也無法訪問到被宣告成 private 的 variable 和 method。因此,即便 parent class 和 child class 擁有同樣的 private method,child class 的 method 也不會 override parent class 的任何 private method。 那為什麼會發生這樣的事情呢?是因為「scope 的不同」,private method/variable 的訪問權被限制在被宣告當下的那個 class 的 scope 下,所以 parent class 和 child class 的 private method/variable 因為 scope 的不同,不會產生 override 的現象。 ```php= <?php abstract class base { public function inherited() { $this->overridden(); } private function overridden() { echo 'base'; } } class child extends base { private function overridden() { echo 'child'; } } $test = new child(); $test->inherited(); // base ?> ``` 從上面的例子我們可以看到,child class 向下呼叫 parent class 的 method 的時候,因為 overriden 這個 method 的 scope 在 parent class,所以它最後 echo 出來的是 `base`。 ```php= <?php abstract class base { public function inherited() { $this->overridden(); } protected function overridden() { echo 'base'; } } class child extends base { protected function overridden() { echo 'child'; } } $test = new child(); $test->inherited(); // child ?> ``` 第二個例子,我們將 visibility 改成 protected 以後,child class 可以訪問到 parent class 的 method,因此對 overriden 這個 method 進行了 override,所以它最後 echo 出來的是 `child`。 ## 結尾 上述對 private method/variable 的例子,可以用其他的程式語言來實現如:`Java`、`C++`。最後所得出的結果也是一樣的。 ## Reference [PHP Visibility](https://www.php.net/manual/en/language.oop5.visibility.php)
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up