2015-05-16 51 views
3

在PHP中有PrivateFinal之间的混淆。关键字'Private'和'Final'有什么区别?

例如,我有3类:

  1. A类(父类)
  2. B类(子类)
  3. C类(其他类)

我明白什么:

  • - 答:个公共变量和方法是A类,B类和C类
  • 乙访问:私人变量和方法是只对A级访问
  • C:保护变量和方法只对A类和B类可访问
  • d:最后方法是只对A级访问不是B类

我的问题是:

使用私有后,我们可以像最终实现的功能,那么为什么我们用最后?

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

+4

[RTM](http://php.net/manual/en/ language.oop5.final.php)如果可见性不是私有的,则子类的最终方法是可访问的。你不能在子类中覆盖它们。所以区别在于最终的方法仍然可以由其他类访问,具体取决于可见性,但是不能将它们作为正常方法覆盖 – Rizier123

+0

这意味着类a的最终方法不能被类b访问,但类c可以访问它们。 –

+3

这取决于它的可见性。 final关键字不会改变方法的可访问性。它只定义了另一个类是否可以覆盖它(何时可以访问它)。但访问权限是由他们的关键字定义的:'private','public','protected' – Rizier123

回答

3

只是要清楚,关键字final没有与方法的知名度,做任何事情。方法的可见性由关键字publicprotectedprivate定义。

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

也只有方法可以是final的,它不能与属性一起使用。


A,B和C是正确的,正如我上面的关键字最终说没有什么关系的知名度,所以d是不正确的。


更多信息请参见相应的手册页:

0

方法的属性final用于向编译器说明给定方法不能在其他地方被覆盖。因此,如果我们声明函数为final,然后我们尝试在其他地方覆盖它,我们将获得warningfatal error

1

最终课程或方法可以不可以被覆盖。

从PHP DOC

PHP 5引入的最终关键字,它防止通过前缀与最后的定义重写的方法的子类。如果该类本身被定义为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

相关问题