1. 程式人生 > >php的常見關鍵字final和clone

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()函式時是完全做不到的。