PHP中的关键字有很多,比如public,protected,static以及描述类的abstract,interface等,在这里我主要写一些对关键字final和clone的理解
final关键字
final关键字是在PHP5后新增的。final有“最终的”含义。如果父类中的方法被声明为final,则子类是无法覆盖该方法的;如果一个类被声明为final,则不能被继承。具体语法:final(关键字) class classname(类名){...}
下面的代码演示了一个final修饰的类不能被继承
<?php
final class test{
public function say(){
echo '我是一个最终类不可以被继承!';
}
}
class func extends test{
}
$ren=new func();
$ren->say();
?>
修改后:
<?php
final class test{
public function say(){
echo '我是一个最终类不可以被继承!';
}
}
//class func extends test{
//
//}
$ren=new test();
$ren->say();
?>
final修饰成员方法语法: authority(访问控制关键字 public等) final function funcname()(方法名及参数列表){....}
以下代码演示了子类继承final成员方法并访问成员方法
<?php
class test{
public function say(){
echo '我是一个普通成员方法。';
}
public final function show(){
echo '我是一个final成员方法。';
}
}
class fun extends test{
}
$tom=new fun();
$tom->say();
$tom->show();
?>
从上面的实例可以看出final类被成功继承到了子类中,并通过访问输出了字符串。下面来尝试覆盖final成员方法
<?php
class test{
public function say(){
echo '我是一个普通成员方法。';
}
public final function show(){
echo '我是一个final成员方法。';
}
}
class fun extends test{
public function show(){
echo '我是覆盖final方法';
}
}
$tom=new fun();
$tom->say();
$tom->show();
?>
所以在以后的编程中如果不想类被子类重写,或者类不想被继承,就可以用final关键字来修饰
clone关键字
在编程过程中有时候需建立一个对象的副本,希望对原对象的修改不会影响到副本对象,实际上可以在实例化一个对象并给属性添加相应的值。但这是比较繁琐的,特别是属性很多的时候。这时候就可以用clone关键字来复制一个一模一样的对象
语法:$newname(新对象名)=clone $objname(要复制的对象名)
复制一个对象并赋值给一个新的对象名,并输出它们的信息
<?php
class test{
private $name;
private $age;
private $sex;
public function __construct($name,$age,$sex){
$this->name=$name;
$this->age=$age;
$this->sex=$sex;
}
public function info(){
echo '我的名字是:'.$this->name.'<br>';
echo '我的年龄是:'.$this->age.'<br>';
echo '我的性别是:'.$this->sex.'<br>';
}
}
$tom=new test("小张",18,"女");
$tom->info();
$jim=clone $tom;
$jim->info();
?>
从结果可以看出,复制后的对象和原来的对象是完全相同的。clone在类中也有一个类似类的构造函数的方法__clone()。它会在使用clone关键字复制一个对象的时候自动调用。所以可以用__clone做一些初始化的工作
__clone的语法:authority(访问控制关键字) function __clone(){...}
代码示例:
<?php
class test{
private $name;
private $age;
// private $sex;
public function __construct($name,$age=0){
$this->name=$name;
$this->age=$age;
// $this->sex=$sex;
}
public function __clone(){
$this->age++;
}
public function info(){
echo '我的名字是:'.$this->name.'<br>';
echo '我的年龄是:'.$this->age.'<br>';
// echo '我的性别是:'.$this->sex.'<br>';
}
}
$tom=new test("小张");
$tom->info();
$jim=clone $tom;
$jim->info();
$jack=clone $jim;
$jack->info();
?>
从结果可以看出,在复制了一个对象后,__clone()函数使得对象的ID递增,控制了复制对象的初始化。这在不使用__clone()函数时是完全做不到的。