关键字'私有'有什么区别?和#'决赛'?

时间:2015-05-16 21:19:08

标签: php oop methods visibility final

在PHP中PrivateFinal之间存在混淆。

例如,我有3个班级:

  1. A类(父类)
  2. B班(儿童班)
  3. C班(其他班级)
  4. 我的理解:

    • A: 公共 变量和方法可供A类,B类和C类访问
    • B: 私有 变量和方法只能由A类访问。
    • C: 受保护的 变量和方法只能由A类和B类访问
    • D: 最终的 方法只能由A类访问,不能访问B类。

    我的问题是:

      

    使用私有后,我们可以实现最终的功能,然后我们使用final?

    我问这个问题只是为了我自己的澄清。

3 个答案:

答案 0 :(得分:4)

为了说清楚,关键字final不必对方法的可见性做任何事情。方法的可见性由关键字定义:publicprotectedprivate

final关键字定义了另一个类是否可以覆盖该方法(如果一个方法是最终的,它不能被antoher类覆盖),而另一个类可以访问该方法。否则它甚至无法访问该方法,因此它既不能使用/调用该方法也不能覆盖它。

此外,只有方法可以是最终的,不能与属性一起使用。

A,B和C是正确的,如上所述,关键字final与可见性无关,因此D不正确。


有关详细信息,请参阅相应的手册页:

答案 1 :(得分:1)

最终的类或方法可以 NOT 覆盖。

来自php doc

  

PHP 5引入了final关键字,它通过在final中添加前缀来阻止子类覆盖方法。如果类本身被定义为final,则无法扩展。

php文档示例:

<?php
class BaseClass {
   public function test() {
       echo "BaseClass::test() called\n";
   }

   final public function moreTesting() {
       echo "BaseClass::moreTesting() called\n";
   }
}

class ChildClass extends BaseClass {
   public function moreTesting() {
       echo "ChildClass::moreTesting() called\n";
   }
}
// Results in Fatal error: Cannot override final method BaseClass::moreTesting()
?>

更多详情:http://php.net/manual/en/language.oop5.final.php

答案 2 :(得分:0)

方法的属性final用于向编译器明确说明给定的方法不能在其他地方被覆盖。

因此,如果我们将某个函数声明为final,然后我们尝试在其他地方覆盖它,我们将获得warningfatal error