PHP 的訪問控制(可見性) 類常量和繼承

2021-08-18 17:54:34 字數 3039 閱讀 4629

protected(受保護的)

private(私有的)

被定義為 protected 的類成員,可以在其自身、子類和父類的內部訪問。

被定義為 private 的類成員,只能在其定義的類內部訪問。

<?php

class

a function

printhello

() /**

* 在父類中訪問子類的成員,子類的 public、protected 的成員在父類中可見

*/public

function

accesschildclass()}

class

bextends

a /**

* 在子類中訪問父類的成員,父類的 public、protected 的成員在子類中可見

*/public

function

accessparentclass()}

$obj = new a('a');

echo

$obj->public; echo

''; // 正常執行,public 的屬性在任何地方可見

//echo $obj->protected; // 致命錯誤,因為 protected 的屬性,只能在其自身、子類和父類中訪問。致命錯誤會終止程式執行。

//echo $obj->private; // 致命錯誤

$obj->printhello(); // 正常執行,輸出 public、protected 和 private

echo

$obj->alias; echo

''; // 正常執行,動態新增的屬性,預設是 public

echo a::hash; echo

''; // 正常執行,類常量在任何地方可見,是屬於類的,而不是屬於物件

echo b::hash; echo

''; // 正常執行,類常量可以被子類繼承

$b = new b('b');

echo

$b->public; echo

''; // public

echo

$b->private; echo

''; // notice: undefined property

//echo $b->protected; // fatal error: uncaught error: cannot access protected property

$b->printhello(); // public、protected2、notice: undefined property: b::$private

$b->accesschildclass(); // protected2--b2,可以在父類中訪問子類的 protected 和 public 的屬性

$b->accessparentclass(); // protected--a2, 也可以在子類中訪問父類的 protected 和 public 的屬性

var_dump(b::status); echo

''; // array(2)

echo a::$static; echo

''; // static

echo b::$static; echo

''; // static

var_dump(b::$s1); echo

''; // array(0)

protected 的屬性,可以在其自身、子類和父類的內部訪問。

private 的屬性,只能在其定義的類內部訪問。

static 關鍵字修飾的靜態屬性,預設是 public 。

非靜態屬性,必須指定訪問修飾符 public、protected 和 private 中的任意乙個。

通過具體的物件訪問,如 (new a('a'))->public;

通過具體的類名訪問,如:a::$static;

protected 的方法,可以在其自身、子類和父類的內部訪問。

private 的方法,只能在其定義的類內部訪問。

也可用 static 關鍵字將方法修飾為靜態方法。

通過具體的物件訪問,如 (new b)->foo();

通過 self::、parent:: 和 static:: 訪問,如 static::foo();

通過具體的類名訪問,如 b::foo();

通過具體的類名訪問,如 b::foo();

通過 $this 訪問,如 $this->foo();

通過具體的物件訪問,如 (new b)->foo();

class

a}

類常量的訪問方式和靜態屬性一致。

類常量可以被繼承。

類常量不能被訪問修飾符 public、protected 和 private 修飾。

類常量不能被靜態修飾符 static 修飾。

類常量區分大小寫。

可見性為 private(私有)的屬性或方法,不能被繼承。

類常量可以被繼承。

被子類繼承的屬性,可以在子類中重寫(覆蓋);否則,將沿用原有的值。

被子類繼承的方法,也可在子類中重寫(覆蓋);否則,將沿用原有的功能。

<?php

class

person

protected

function

getage

() protected

function

getclass

() private

function

getphone()}

class

tomextends

person

public

function

printinfo()}

$obj = new tom();

$obj->getname(); // --tom

$obj->printinfo(); // 20--20--person

PHP 訪問控制(可見性)

define myclass class myclass obj new myclass echo obj public 這行能被正常執行 echo obj protected 這行會產生乙個致命錯誤 echo obj private 這行也會產生乙個致命錯誤 obj printhello 輸出 p...

類成員的可見性

private 具有private屬性的成員稱為私有成員,只有本單元檔案中的程式可以訪問私有成員,而其他單元或者主程式均不能訪問這些成員。如果在乙個單元檔案中定義了2個類,則乙個類可以訪問另乙個類的私有成員。被定義的類成員僅在該類的方法中可被訪問,它的子類和例項都無法訪問。public 具有publ...

控制符號的可見性

在普通的c語言中,如果您希望將函式或者變數限制在當前檔案中,需要對其使用static關鍵字。然而,在乙個包含很多檔案的共享庫中,如果您希望某個符號可以被共享庫內部的幾個檔案訪問,而又不提供給外部,則對符號進行隱藏處理就會比較困難。大多數的聯結器都提供一些便利的方法來隱藏或者顯示模組中所有的符號,但如...