【PHP面试题05】private、protected、public、final 区别是什么

文章目录


一、介绍

本文已收录于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成员和方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值