一、final
1.<?php
//final用于类、方法之前//final不可被继承
//final方法不可被覆盖
final class fun
{
//成员属性
public $name="小强";
//
public function math()
{
echo "蟑螂为什么叫做".$this->name.'?';
}
}
//类的实例化
$f =new fun();
$f->math();
//类的继承
class fun1 extends fun
{
public function math1()
{
echo "因为".$this->name."就是蟑螂!";
}
}
$f1 =new fun1();
$f1->math1();
?>
以上程序报错:Fatal error: Class fun1 may not inherit from final class (fun) in D:\www\test.com\www\oop\final.php on line 28
2.
<?php
//final用于类、方法之前
//final不可被继承
//final方法不可被覆盖
class fun
{
//成员属性
public $name="小强";
//防止子类方法被重写使用final
final public function math()
{
echo "蟑螂为什么叫做".$this->name.'?';
}
}
//类的实例化
$f =new fun();
$f->math();
//类的继承
class fun1 extends fun
{
public function math()
{
echo "因为".$this->name."就是蟑螂!";
}
}
$f =new fun();
$f->math();
?>
页面报错:Fatal error: Cannot override final method fun::math() in D:\www\test.com\www\oop\final2.php on line 28
在父类的方法前面加上final 子类方法不能被重写
二.php5类中的常量
我们使用const 定义一个常量,定义的这个常量不能被改变
在 PHP5 中 const 定义的常量与定义变量的方法不同,不需要加 $ 修饰符。 const PI = 3.14; 这样就可以。而使用 const 定义的常量名称一般都大写,这是一个约定,类中的常量使用起来类似静态变量,不同点只是它的值不能被改变。我们使用 类名::常量名来调用这个常量
例子:
<?php
class fun
{
const A="这是类常量,";
}
echo fun::A.'使用类名::常量名来调用';
?>
三. 可以使用abstract 来修饰一个类或者方法
用abstract修饰的类表示这个类是一个抽象类, 用abstract 修饰
的方法表示这个方法是一个抽象方法。
抽象类不能被实例化。
抽象方法是只有方法声明,而没有方法的实现内容。
例子为证:
(1)<?php
//抽象类不能被实例化
//声明一个抽象类
abstract class fun
{
public $name = "小鲁";
public function abc()
{
echo "我的名字是:".$this->name;
}
}
$f= new fun();
$f->abc();
?>
页面报错:Fatal error: Cannot instantiate abstract class fun in D:\www\test.com\www\oop\abstract.php on line 12
(2)这个就可以正常显示了
<?php
//抽象类不能被实例化
//声明一个抽象类
abstract class fun
{
public $name = "小鲁";
final public function abc()
{
echo "我的名字是:".$this->name;
}
}
//继承自父类fun
class fun1 extends fun{
}
//虽然父类不能被实例化 但是子类可以可以被实例化
$f= new fun1();
$f->abc();
?>
四.接口的定义和规范
接口(interface)是抽象方法和静态常量定义的集合。
接口是一种特殊的抽象类,这种抽象类中只包含抽象方法和静态常量。
接口中没有其它类型的内容。
在接口中只能有抽象方法。如果在接口中出现了非抽象方法,会报错如下:
Interface function User::setName() cannot contain body in ……….
在接口中的抽象方法只能是public 的,默认也是public 权限。
并且不能设置成 private 或者 protected 类型。
在接口中可以使用静态抽象方法。在PHP5.2 中,不建议在抽象类中使用静态抽象方法。
而接口中依然保留了静态抽象方法。
一个类可以使用 implements实现接口,甚至可以实现多个接口。
//一个类可以继承和接口同时实现
class student
{
protected $grade;
public function getGrade()
{
return $this->grade;
}
}
//一个类可以实现多个接口。只要使用 ,号将多个接口链接起来就可以
//接口1
interface user
{
function getname();
function setname($_name);
}
//接口2
//只有管理员可以设置公告
interface administrator
{
function setbulletin($_bulletin);
}
//一个类可以实现多个接口
class studentadmin extends student implements user,administrator
{
function getname(){}
function setname($_name){}
function setbulletin($_bulletin){}
}
//实例化对象
$s= new studentadmin();
echo $s->getGrade();
echo $s->getname();
echo $s->setBulletin("公告内容");
?>
接口的继承
一个接口可以继承另外一个接口
PHP5 中的类是单继承,但是接口很特殊。一个接口可以继承自多个接口
一个接口继承其它接口时候,直接继承父接口的静态常量属性和抽象方法。
要注意只有接口和接口之间使用 继承关键字 extends。
类实现接口必须实现其抽象方法,使用实现关键字 implements。
抽象类实现接口,可以不实现其中的抽象方法,而将抽象方法的实现交付给具体能被实
例化的类去处理
<?php
//抽象类实现接口,抽象类实现接口,可以不实现其中的抽象方法,而将抽象方法的实现交付给具体能被实
//例化的类(比如说抽象类不能被实例化,但是他的子类可以被实例化)去处理
//接口1
interface user
{
function getname();
function setname($_name);
}
//abstractnornaluser 只实现了user接口中的一个方法
//声明一个抽象类
abstract class abstractnornaluser
{
protected $name;
public function getname(){
return $this->name;
}
}
//这里实现了接口的另一个方法
class nornaluser extends abstractnornaluser{
public function setname($_name){
$this->name=$_name;
}
}
$nouser =new nornaluser();
$nouser->setname("tom");
echo "你叫".$nouser->getname();
?>