PHP 可见性模式
phpserver side programmingprogramming更新于 2025/8/19 17:52:17
简介
在 PHP 中,可以使用 class 关键字创建用户定义的复合数据类型。类的新实例是一个对象。对象的特征与类的定义一致,可能包含属性、常量和方法成员。
类成员的可访问性(也称为可见性)取决于其定义中附加的可见性前缀关键字。PHP 有三个可见性关键字 - public、private 和 protected。使用 public 关键字声明的类成员可以从任何地方访问。protected 成员可以从其类内部以及通过继承类访问。另一方面,private 成员只能由定义它的类访问,并且对其外部的任何对象都不可见。
属性可见性
属性是类实例的一个属性 (Attribute)。它可以是实例属性(每个对象具有不同的值),也可以是类属性(每个对象具有相同的值)。属性可以是任何有效的 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(); //在公共方法中调用私有方法和受保护方法
$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 开始,可见性模式可用于常量。常量的默认可见性为 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 . "
";
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

