PHP可见性模式

2023年11月30日12:57:26

介绍

在PHP中,可以使用class关键字具有用户定义的compund数据类型。类的新实例是一个对象。对象的特性按照类的定义,可以包含属性,常量和方法成员。

类成员的可访问性(也称为可见性)取决于其定义中附加的可见性前缀关键字。PHP具有三个可见性关键字-publicprivateprotected。任何地方都可以访问用public关键字声明的类成员。受保护的成员可以从其类内部或通过继承类进行访问。另一方面,私有成员只能由定义了私有成员的同一个类访问,并且外部的任何成员都不可见。

属性可见度

属性是类实例的属性。它可以是实例属性(每个对象具有不同的值)或类属性,每个对象具有相同的值。属性可以是任何有效的PHP数据类型。默认情况下,属性具有公共可见性。如果使用var关键字定义了属性(现已弃用),则将其视为public。

示例

<?php
class myclass{
   public $fname="Ajay";
   var $lname; //treated as public
   private $marks=100;
   protected $age=20;
}
$obj=new myclass();
echo "$obj->fname\n";
$obj->lname="Diwan";
echo "$obj->marks\n";
$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\n";
      echo "marks=$this->marks age=$this->age";
   }
}
$obj=new myclass();
$obj->displaydata();
?>

输出结果

这将产生以下结果。-

Ajay Diwan
marks=100 age=20

方法可见性

像类属性一样,还可以使用公共,私有和受保护的关键字为类方法分配可见性。默认情况下,方法也被视为公共方法。

示例

<?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\n";
   }
   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\n";
      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\n";
   }
   public function test1(){
      echo "testclass public method\n";
   }
   protected function test2(){
      echo "testclass protected method\n";
   }
   function test3(){
      echo "x=$this->x y=$this->y z=$this->z\n";
   }
}
class newclass extends testclass{
   function test1(){
      echo "newclass public method\n";
   }
   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开始,可见性模式可以与constaants一起使用。常量的默认可见性是public

示例

<?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 . "\n";
echo testclass::Z . "\n";
?>

输出结果

这将显示以下结果

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

  • 更新时间:2023年11月30日12:57:26 ,共 3545 字。