为什么把重写和final放在一起,原因就是一条:final的意思是不可更改的,也就是说final定义的东西是不可改变的,下面具体来说一下。
来看一段简单的代码:
 class BaseClass {
    final public function test() {
        echo "BaseClass::test() called\n";
    }
    public function moreTesting() {
        echo "BaseClass::moreTesting() called\n";
    }
 }
 final class AbcClass{
   public function abc(){
     echo "abc";
   }
 }
 /*
 class Abcd extends AbcClass{
   public function abcd(){
   }
 }
 */
 class ChildClass extends BaseClass {
    public function moreTesting($tmp=null) {
        echo "ChildClass::moreTesting() called\n";
    }
 }
代码中定义了一个类,BaseClass然后ChildClass继承了这个类并且重写了这个类中的方法moreTesting,重写方法的时候方法名一定要一样,参数可以改变。这时候对象调用的时候就是调用的重写后的方法。
代码中注释了一个地方,如果这段代码被执行就会报错,因为AbcClass是final关键字定义的类,可以正常被使用,但不能被任何类继承。
类中final关键字定义的方法也不能被重写,比如BaseClass中的test方法,只能使用,如果重写会出现错误。