php的常見關鍵字final和clone
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()函式時是完全做不到的。