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

更新於: 2020-09-18

2K+ 瀏覽量

開啟你的 職業生涯

透過完成課程獲得認證

開始學習
廣告

© . All rights reserved.