php类abstract和final,类方法abstract和final, interface
final:
当final作用于某个类时,此类被限定为不可继承类,即其他类无法继承此类,最终类,当你不想让别人继承自己的编写的类时只需要在前面加上final关键字即可。
1 2 3 4 5
| final class MyClass { }
}
|
当final作用于某个类方法时,此方法被限定为不可重写,即子类中不可以重写此方法,并非不可继承,类方法可否被继承依旧被public protected private限定,但即便父类的fianl private方法无法被子类继承,子类中仍然不能重写此方法。
php的继承机制是先检查此方法是不是final,若为final子类中仍重写此方法,则报错只有在不是final时才会进一步依据public protected private来限定子类是否能继承此方法,且重写追寻访问权限必须宽松于父类的原则。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| class MyClass { final public function finalPublic() { echo __METHOD__; } final private function finalPrivate() { echo __METHOD__; } final protected function finalProtected () { echo __METHOD__; } }
class CorrectSubClass extends Myclass { }
class ErrorSubClass extends Myclass { public function finalPublic() { echo __METHOD__; } protected function finalProtected () { echo __METHOD__; } }
|
abstract:
当abstract作用于某个类时,此类被限定为抽象类,只能用于继承,而无法实例化对象。
抽象类不一定含有抽象方法,但抽象方法一定存在于抽象类中,且继承此抽象类的子类必须全部实现其抽象方法,否则,子类也要标识为抽象类。
抽象方法是必须被子类继承实现的,所以不可以用private修饰符去限定abstract抽象方法,可以用public和protected去修饰。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| abstract class MyClass { abstract public function abstractFunc(); abstract public function abstractFuncOther(); public function index() { } } abstract class SubAbstract extends MyClass { }
class Sub extends MyClass { public function abstractFunc() { } public function abstractFuncOther() { } }
|
实例汇总:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124
| <?php
* final class 不可以被其他类继承 终结类 */ final class FinalClass { public function index() { echo "i am " . __METHOD__; } }
class FinalMethod { final public function finalPublic() { echo __METHOD__ . ' can be inherited, but be overrided' . '<br/>'; } final protected function fianlProtected() { echo __METHOD__ . ' can be inherited, but be overrided' . '<br/>'; } final private function finalPrivate() { echo __METHOD__ . ' can not be inherited or be overrided' . '<br/>'; } } class MethodClass extends FinalMethod { public function index() { $this->finalPublic(); $this->fianlProtected(); } } echo '==================== final ======================' . '<br/>'; $method = new MethodClass(); $method->index();
abstract class AbstractClass { public function index() { $this->abstractPublicFunc(); $this->abstractProtectedFunc(); } abstract public function abstractPublicFunc(); abstract protected function abstractProtectedFunc(); }
abstract class SubAbstractClass extends AbstractClass { { echo __CLASS__ . __METHOD__ . '<br/>'; } }
class ObjectClass extends SubAbstractClass { public function abstractPublicFunc() { echo __METHOD__ . '<br/>'; } { echo __METHOD__ . '<br/>'; } } echo '====================abstract=====================' . '<br/>'; $abstract = new ObjectClass(); $abstract->index(); * 接口是用来定义一套行为标准 任何使用此接口的类都必须追寻接口所声明的方法标准 是一套不需要使用abstract修饰的但全部为抽象方法的标准类 */ interface MyInterface { public function getName(); public function getAge(); public function getSex(); } class User implements MyInterface { private $name = null; private $age = null; private $sex = null; public function __construct($name, $age, $sex) { $this->name = $name; $this->age = $age; $this->sex = $sex; } public function getName() { echo $this->name . '<br/>'; } public function getAge() { echo $this->age . '<br/>'; } public function getSex() { echo $this->sex . '<br/>'; } } $user = new User('sallency', 25, 'male'); echo '====================interface=====================' . '<br/>'; $user->getName(); $user->getAge(); $user->getSex(); ?>
|
本文早期发布于个人 CSDN 博客:查看原文