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+ 浏览量

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告