Php 简明教程
PHP – Access Modifiers
在 PHP 中,关键字 public, private 和 protected 被称为 access modifiers 。这些关键字控制类属性和方法的可访问性或可见性的范围。其中一个关键字在声明成员变量和定义成员函数时添加为前缀。
PHP 代码是否可以自由地访问类成员,或者被限制获取,或者有条件地访问,是由这些关键字决定的 -
-
Public − 类成员从任何地方都可以访问,即使在类作用域外,但只可以使用对象引用。
-
Private − 类成员可以在类中访问。它防止外部类访问成员,即使参考了类实例。
-
Protected − 成员只能在类及其子类中访问,其他地方都不能访问。
数据封装原则是面向对象编程方法的基础。它指的是将对象的成员数据或属性置于类外部环境的访问范围之外,只允许通过类中可用的方法或函数进行受控访问。
要实现封装,类的成员数据被设为 private ,方法被设为 public 。
Public Members
在 PHP 中,类成员(成员变量和其他成员函数)默认情况下是公开的。
Example
在下面的程序中,对象的成员变量 title 和 price 在类的外部可以自由访问,因为它们默认情况下是公开的,除非另行指定。
<?php
class Book {
/* Member variables */
var $price;
var $title;
/*Constructor*/
function __construct(string $param1="PHP Basics", int $param2=380) {
$this->title = $param1;
$this->price = $param2;
}
function getPrice() {
echo "Title: $this->price \n";
}
function getTitle() {
echo "Price: $this->title \n";
}
}
$b1 = new Book();
echo "Title : $b1->title Price: $b1->price";
?>
它将生成以下 output −
Title : PHP Basics Price: 380
Private Members
如上所述,封装原则要求不得直接访问成员变量。只有方法应具有对数据成员的访问权。因此,我们需要将成员变量设为私有,并将方法设为公有。
<?php
class Book {
/* Member variables */
private $price;
private $title;
/*Constructor*/
function __construct(string $param1="PHP Basics", int $param2=380) {
$this->title = $param1;
$this->price = $param2;
}
public function getPrice() {
echo "Price: $this->price \n";
}
public function getTitle() {
echo "Title: $this->title \n;";
}
}
$b1 = new Book();
$b1->getTitle();
$b1->getPrice();
echo "Title : $b1->title Price: $b1->price";
?>
Protected Members
针对类成员指定受保护的访问权在类继承的情况下有效。我们知道可以从类的外围访问公有成员,并且不能从类的外围访问私有成员。
protected 关键字允许访问同一类的对象和继承类中的对象,但禁止访问其他环境。
让我们在 Book 类示例中将标题成员设置为受保护的,将价格保留为私有的。
class Book {
/* Member variables */
private $price;
protected $title;
# rest of the code kept as it is
}
$b1 = new Book();
$b1->getTitle();
$b1->getPrice();
PHP 允许访问两个成员变量,因为该对象属于同一个类。
让我们添加一个 mybook 类,它继承了 Book 类 −
class mybook extends Book {
# no additional members defined
}
它的对象仍能访问成员变量,因为子类继承了父类的公有和受保护的成员。
但是,将 mybook 类作为一个独立的类(不扩展 Book 类)并定义一个 getmytitle() 函数,该函数尝试访问 Book 类的受保护标题成员变量。
class mybook {
public function getmytitle($b) {
echo "Title: $b->title <br/>";
}
}
$b1 = new mybook();
$b = new Book();
$b1->getmytitle($b);
由于 getmytitle() 函数尝试打印 Book 对象的标题,因此一个显示 Cannot access protected property Book::$title 的错误消息被引发。
Example
尝试运行以下代码 −
<?php
class Book {
private $price;
protected $title;
function __construct(string $param1="PHP Basics", int $param2=380) {
$this->title = $param1;
$this->price = $param2;
}
public function getPrice(){
echo "Price: $this->price <br/>";
}
public function getTitle(){
echo "Title: $this->title <br/>";
}
}
class mybook {
public function getmytitle($b) {
echo "Title: $b->title <br/>";
}
}
$b1 = new mybook();
$b = new Book();
$b1->getmytitle($b);
?>
它将生成以下 output −
PHP Fatal error: Uncaught Error: Cannot access protected property
Book::$title in /home/cg/root/97848/main.php:18
因此,可以看到受保护的成员只能被同一类和继承类的对象访问。对于所有其他环境,受保护的成员不可访问。
可访问性规则可以由下表总结: