PHP 可見性模式
簡介
在 PHP 中,可以使用 **class** 關鍵字定義使用者自定義的複合資料型別。類的新的例項是一個物件。物件的特徵根據類的定義,可能包含屬性、常量和方法成員。
類成員的可訪問性(也稱為可見性)取決於其定義中附加的可見性字首關鍵字。PHP 有三個可見性關鍵字 - **public**、**private** 和 **protected**。使用 public 關鍵字宣告的類成員可以在任何地方訪問。受保護的成員可以在其類內部以及繼承類中訪問。另一方面,私有成員只能由定義它的同一個類訪問,並且對外部不可見。
屬性可見性
屬性是類例項的特性。它可以是例項屬性(每個物件具有不同的值)或類屬性(每個物件具有相同的值)。屬性可以是任何有效的 PHP 資料型別。屬性預設具有公共可見性。如果使用 var 關鍵字定義屬性(該關鍵字現已棄用),則將其視為公共屬性。
示例
<?php
class myclass{
public $fname="Ajay";
var $lname; //treated as public
private $marks=100;
protected $age=20;
}
$obj=new myclass();
echo "$obj->fname
";
$obj->lname="Diwan";
echo "$obj->marks
";
$obj->age=21;
?>輸出
以下輸出顯示公共屬性可以在類外部訪問,而私有和受保護屬性會引發未捕獲的錯誤
Ajay PHP Fatal error: Uncaught Error: Cannot access private property myclass::$marks PHP Fatal error: Uncaught Error: Cannot access protected property myclass::$age
但是,私有和受保護屬性可以在同一個類中的函式內部使用
示例
<?php
class myclass{
public $fname="Ajay";
var $lname;
private $marks=100;
protected $age=20;
function displaydata(){
$this->lname="Diwan";
echo "$this->fname $this->lname
";
echo "marks=$this->marks age=$this->age";
}
}
$obj=new myclass();
$obj->displaydata();
?>輸出
這將產生以下結果:−
Ajay Diwan marks=100 age=20
方法可見性
與類屬性類似,類方法也可以使用 public、private 和 protected 關鍵字分配可見性。方法預設也視為公共方法。
示例
<?php
class myclass{
public $fname="Ajay";
var $lname;
private $marks=100;
protected $age=20;
public function setname(){
$this->fname="Anil";
$this->lname="Dave";
echo "name changed
";
}
private function setmarks(){
$this->marks=90;
}
protected function setage(){
$this->age=21;
}
function setdata(){
$this->setname();
$this->setmarks();
$this->setage();
}
function displaydata(){
$this->lname="Diwan";
echo "$this->fname $this->lname
";
echo "marks=$this->marks age=$this->age";
}
}
$obj=new myclass();
$obj->setname();//works
$obj->setmarks();//error
$obj->setage();/error
$obj->setdata(); //private and protected methods called withing public method
$obj->displaydata();
?>輸出
這將產生以下結果:−
name changed PHP Fatal error: Uncaught Error: Call to private method myclass::setmarks() from context '' PHP Fatal error: Uncaught Error: Call to protected method myclass::setage() from context '' Anil Dave marks=90 age=21
繼承中的方法可見性
**父**類方法可以在**子**類定義中被重寫。父類的私有和受保護方法對於子類的物件不可用。但是,父類中受保護的方法可以在子類方法中使用
示例
<?php
class testclass{
public $x=10;
private $y=20;
protected $z=30;
private function test(){
echo "testclass private method
";
}
public function test1(){
echo "testclass public method
";
}
protected function test2(){
echo "testclass protected method
";
}
function test3(){
echo "x=$this->x y=$this->y z=$this->z
";
}
}
class newclass extends testclass{
function test1(){
echo "newclass public method
";
}
public function test4(){
$this->test();
$this->test1();
$this->test2();
}
}
$obj=new newclass();
echo $obj->test1();
echo $obj->test3();
echo $obj->test4();
?>輸出
這將顯示以下結果
newclass public method x=10 y=20 z=30 PHP Fatal error: Uncaught Error: Call to private method testclass::test() from context 'newclass'
常量可見性
從 PHP 7.1 開始,可見性模式可以與常量一起使用。常量的預設可見性為公共。
示例
<?php
class testclass{
public const X=10;
private const Y=20;
protected const Z=30;
function showconst(){
echo "x=" . self::X ;
echo "y=" . self::Y;
echo "z=" . self::Z ;
}
}
$obj=new testclass();
$obj->showconst();
echo testclass::Y . "
";
echo testclass::Z . "
";
?>輸出
這將顯示以下結果
x=10y=20z=30 PHP Fatal error: Uncaught Error: Cannot access private const testclass::Y PHP Fatal error: Uncaught Error: Cannot access protected const testclass::Z
廣告
資料結構
網路
關係資料庫管理系統
作業系統
Java
iOS
HTML
CSS
Android
Python
C 程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP