继承和实现接口的比较:
(1) 可以认为 实现接口是对单一继承的补充.
(2) 可以在不破坏类层级关系的前提下,对某个类功能扩展.
-------------------------------------------------------------------------------------------------------------------------------------------------------------
1. 如果我们希望某个类不被其它的类来继承(可能因为安全考虑...), 可以使用final
<?php
final class A{
}
class B extends A{
}
echo "ok";
?>
2. 如果我们希望某个方法,比如计算个人所得税的方法,不能子类改写,可以使用fianl 来修饰方法
class A{
final public function getRate($salary){
return $salary*0.08;
}
}
class B extends A{
//不能去覆盖父类的getRate方法.
/*public function getRate($sal){
return $sal*0.01;
}*/
}
$b=new B();
echo $b->getRate(100);
3. final关键字不能去修饰属性.????????????
----------------------------------------------------------------------------------------------------------------------------
u const 关键字的讲解
//当你有一个属性,不希望被修改,则考虑使用const 做成常量
基本用法是
class A{
const 常量名=赋初值;
}
interface 接口名{
const 常量名=赋初值;
}
常量是public
使用 类名::常量名; 接口名::常量
<?php
class A{
//常量在定义的时候,必须给初值.
//const 关键字前面不要带修饰符号.
const TAX_RATE=0.08;
public function payTax($val){
//常量不能修改.
//A::TAX_RATE=0.01;
//return $val*self::TAX_RATE; 【ok】
return $val*A::TAX_RATE; //【ok】
}
}
$a=new A();
echo $a->payTax(200);
?>
1. 常量在定义的时候需要赋初值
2. 常量不能修改.
3. 常量名不能有 $, 一般是大写, 默认是public
4. 常量在类的内部使用 self::常量的名称 类名::常量的名称
在类的外部使用 类名::常量的名称.