php面向對象高級應用詳解(1)

php面向對象之instanceof關鍵字的用法

instanceof的作用有2個:(1)判斷一個對象是否是某個類的實例,(2)判斷一個對象是否實現了某個接口。

(1)判斷一個對象是否是某個類的實例

下面針對第一種用法我們來看個實例:

首先創建一個父類,再創建一個子類去繼承父類。實例化子類對象,然後去判斷對象是不是屬於子類,再判斷是不是屬於父類。

<?php

class Itbook{

}

class Phpbook extends Itbook{
  private $bookname;
}

$book = new Phpbook();
if($book instanceof Phpbook){
  echo '$book屬於Phpbook類<br>';
}
if($book instanceof Itbook){
  echo '$book屬於Itbook類';
}

(2)判斷一個對象是否實現了某個接口

 

<?php

interface TestInterface{
  public function interfaceMethod();
}

class TestClass implements TestInterface{
  public function interfaceMethod(){
    return 'cyy is cute.';
  }
}

$test = new TestClass();
if($test instanceof TestInterface){
  echo '$test實現接口TestInterface';
}else{
  echo '$test沒有實現接口TestInterface';
}

 

 

php面向對象之對象克隆方法

使用傳址引用的方式調用對象,實質調用的是同一個對象,有時需要建設立一個對象的副本,改變原來的對象時不希望影響到副本,在PHP中可以根據現在的對象來克隆出一個完全一樣的對象,克隆出來的副本和原本兩個對象完全獨立而互不干擾。

我們舉個簡單的例子來看一下克隆的用法:

 

<?php

class Person{
  public $name;
  function __construct($name){
    $this->name = $name;
  }

  function me(){
    echo '我是:'.$this->name;
  }
}

$person1 = new Person('cyy');
$person2 = clone $person1;
$person1->me();
echo '<br>';
$person2->me();

結果如下:

我是:cyy
我是:cyy

 

還是上面的實例,只是稍微發生點變動。

<?php

class Person{
  public $name;
  function __construct($name){
    $this->name = $name;
  }

  function me(){
    echo '我是:'.$this->name;
  }
}

$person1 = new Person('cyy');
$person2 = clone $person1;
$person1->me();
echo '<br>';
$person2->name='cyy2';
$person2->me();

上述實例的結果

我是:cyy
我是:cyy2

 

__clone的用法

很多時候我們不單單要去克隆一個對象,還想讓對象可以擁有自己的屬性和方法。那麼我們就要在類中創建一個__clone方法。這個方法類似於構造函數和析構函數,因爲不會直接調用它。

還是以上面的實例爲例:

<?php

class Person{
  public $name;
  function __construct($name){
    $this->name = $name;
  }

  function __clone(){
    $this->name = 'cyy01';
  }

  function me(){
    echo '我是:'.$this->name;
  }
}

$person1 = new Person('cyy');
$person2 = clone $person1;
$person1->me();
echo '<br>';
$person2->me();

結果如下:

我是:cyy
我是:cyy01

 

php面向對象之對象比較用法詳解

運算符“==”和“===”

當使用比較運算符(==)比較兩個對象變量時,比較的原則是:如果兩個對象的屬性個屬性值都相等,而且兩個對象是同一個類的實例,那麼這兩個對象變量相等;

而如果使用全等運算符(===),這兩個對象變量一定要指向某各類的同一個實例(即同一個對象)。

下面我們看個實例:

<?php

class Person{
  public $name;
  function __construct($name){
    $this->name = $name;
  }
}

$person1 = new Person('cyy');
$person2 = new Person('cyy');
if($person1 === $person2){
  echo '$person1 === $person2<br>';
}else if($person1 == $person2){
  echo '$person1 == $person2<br>';
}else{
  echo '$person1 != $person2<br>';
}

$person3 = $person1;
if($person1 === $person3){
  echo '$person1 === $person3<br>';
}else if($person1 == $person3){
  echo '$person1 == $person3<br>';
}else{
  echo '$person1 != $person3<br>';
}

結果如下:

$person1 == $person2
$person1 === $person3

 

實例解析:

使用全等運算符(===),這兩個對象變量一定要指向某各類的同一個實例(即同一個對象)。只有當運算符“===”兩邊比較的值是同一個對象的時候,才能成立。

 

php面向對象之什麼是抽象類?及抽象類的作用

什麼是抽象類?

抽象類不能被實例化,同樣方法也沒有實現,只是提供方法聲明,沒有具體實現。抽象類只能作爲其他類的父類使用。

抽象類和普通類也差不多,都有成員變量和成員方法。但還是有區別的。包含抽象方法的類必須本身是抽象的。抽象方法是沒有方法體的,他的功能只能在子類中完成。

 

抽象類實例講解:

<?php

abstract class Member{
  abstract function vipMember($name,$level);
}

class Member1 extends Member{
  function vipMember($name,$level){
    echo 'my name is '.$name.', my level is '.$level;
  }

}

class Member2 extends Member{
  function vipMember($name,$level){
    echo 'my name is '.$name.', my level is '.$level;
  }
}


$mem1 = new Member1();
$mem1->vipMember('cyy','1');
echo '<br>';
$mem1 = new Member1();
$mem1->vipMember('cyy2','2');

 

php面向對象之final關鍵字用法及實例

什麼是final關鍵字?

final中文翻譯爲“最終的”,“最後的”。在聲明一個類之前用final關鍵詞修飾,說明這個函數將不能在任何子類中被重載,繼承,也就是說,被final修飾的類將不能再有子類。

final用法實例詳解:

<?php

class A{
  public $num = 25;
  final function operation(){
    echo 'num is '.$this->num;
  }
}

class B extends A{
  public $num = 50;
  function operation(){
    echo 'num is '.$this->num;
  }
}

$num = new B();
$num->operation();

 

 

上述示例中禁止了在B類中重載A類中的operation()方法。這樣做只會報錯。

如果final寫在類之前,那麼講禁止整個類被繼承。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章