文章目录
一、介绍
本文已收录于PHP全栈系列专栏:PHP面试专区。-
计划将全覆盖PHP开发领域所有的面试题,对标资深工程师/架构师序列
,欢迎大家提前关注锁定。
关于这几个限定词,是一些比较基础的面试题,一般我们肯定知道他们的用法,但是为什么这么用,很多时候还是值得思考的。今天本文就这几种情况进行一下说明,各位面试的宝宝记得先给一个关注或者收藏,避免以后找不到了。
在PHP中,类成员和方法有不同的访问级别。访问级别定义了一个成员或方法谁能够访问它。PHP中有四个访问级别:private、protected、public和final。本篇博文将介绍这几个访问级别,并分析它们之间的区别。
二、四种限定词区别
2.1 private
当成员或方法被声明为private时,它只能在所属类内部被访问。外部代码不能访问这个成员或方法。我们来看一个例子:
class Person {
private $name;
public function showName() {
echo $this->name;
}
}
$person = new Person();
$person->name = "XiaoMin"; // 这里会报错,因为$name是private类型
在上面的例子中,我们创建了一个类Person,其中包含一个私有成员 n a m e 。 s h o w N a m e ( ) 方法尝试输出 name。showName()方法尝试输出 name。showName()方法尝试输出name的值,但由于 n a m e 的访问级别是 p r i v a t e ,而外部代码又直接尝试给 name的访问级别是private,而外部代码又直接尝试给 name的访问级别是private,而外部代码又直接尝试给name赋值,所以程序报错。
需要注意的是,子类无法访问父类中的私有成员或方法。下面是一个例子:
class Person {
private $name;
}
class Student extends Person {
public function showName() {
echo $this->name; // 这里会报错,因为$name是private类型
}
}
在上面的例子中,我们定义了一个父类Person和一个子类Student。子类Student尝试在showName()方法中输出父类Person中的私有成员 n a m e ,但由于 name,但由于 name,但由于name的访问级别是private,所以程序报错。
2.2 protected
当成员或方法被声明为protected时,它只能在所属类和子类中被访问。外部代码不能访问这个成员或方法。接下来我们看一个例子:
class Person {
protected $name;
}
class Student extends Person {
public function showName() {
echo $this->name; // 可以访问父类中的$name
}
}
$student = new Student();
$student->name = "XiaoMin"; // 这里会报错,因为$name是protected类型
在上面的例子中,我们定义了一个父类Person和一个子类Student。父类Person包含一个受保护的成员$name,子类Student可以访问该成员并将其输出。但外部代码不能直接访问该成员,否则会报错。
需要注意的是,在子类中调用父类的受保护方法时,可以使用parent关键字。下面是一个例子:
class Person {
protected $name;
protected function getName() {
return $this->name;
}
}
class Student extends Person {
public function showName() {
echo parent::getName(); // 调用父类的getName()方法
}
}
在上面的例子中,我们定义了一个父类Person和一个子类Student。父类Person包含一个受保护的getName()方法,该方法返回 n a m e 的值。子类 S t u d e n t 通过调用 p a r e n t : : g e t N a m e ( ) 方法来获取 name的值。子类Student通过调用parent::getName()方法来获取 name的值。子类Student通过调用parent::getName()方法来获取name的值。
2.3 public
当成员或方法被声明为public时,它可以在任何地方被访问,包括类内部、子类和外部代码。下面是一个例子:
class Person {
public $name;
}
$person = new Person();
$person->name = "XiaoMin"; // 可以直接访问$name
在上面的例子中,我们定义了一个类Person,并将$name成员声明为public访问级别。外部代码可以直接访问该成员并给它赋值。
需要注意的是,尽管public成员可以在任何地方被访问,但这并不代表我们应该在代码中到处使用public成员。这样做可能会增加代码的复杂性,并使代码更难以维护。因此,我们应该尽可能地对类成员使用private或protected访问级别,只有在真正需要时才将其改为public。
2.4 final
当一个类或方法被声明为final时,它不能被继承或覆盖。下面是一个例子:
final class Person {
protected $name;
public function showName() {
echo $this->name;
}
}
class Student extends Person {
// 这里会报错,因为Person类是final的,不能被继承
}
在上面的例子中,我们定义了一个类Person,并将其声明为final。这意味着Person类不能被继承。子类Student尝试从Person类中继承成员和方法,但由于Person类是final的,所以程序报错。
需要注意的是,虽然final成员和方法不能被覆盖,但它们仍然可以被子类继承和访问。
总结
本篇博文介绍了PHP中的四种访问级别:private、protected、public和final。private成员和方法只能在所属类内部被访问,protected成员和方法可以在所属类和子类中被访问,public成员和方法可以在任何地方被访问,final类和方法不能被继承或覆盖。在编写代码时,应该根据具体情况选择适当的访问级别,避免滥用public成员和方法。