1. 程式人生 > >PHP學習筆記15(面向物件)

PHP學習筆記15(面向物件)

面向物件內容

面向物件首先就要搞清楚什麼是類,什麼是物件。簡單來說,類就是對事物抽象特點的定義,一個類中包含成員的資料形式以及對這些資料進行的操作。物件就是類的一個個具體例子。例如,我們可以把所有的汽車當成一個類,而寶馬X3、賓士AMG、奧迪A6這些車都是汽車類的物件。

PHP 類定義

在PHP中,使用class關鍵字跟上類的名字來對類進行定義。後面加一對花括號來對類中具體的成員和成員函式進行定義。類中變數使用var關鍵字來定義,而類中函式使用function關鍵字進行定義。

<?php
class MyFirstPhpClass
{
var $a;
function fun()
    {
        echo "this is my first PHP class";
    }
}
?>

注:在PHP中,常用$this來代表自身物件。

PHP 中建立物件

使用關鍵字new來例項化一個物件

$obj = new MyFirstPhpClass;

例項化物件之後,每個物件都有了這個類的特徵。

完整的建立類、例項化、和呼叫成員函式的例子(來源:runoob.com):

<?php 
class Site { 
  /* 成員變數 */ 
  var $url; 
  var $title; 
   
  /* 成員函式 */ 
  function setUrl($par){ 
     $this->url = $par; 
  } 
   
  function getUrl(){ 
     echo $this->url . PHP_EOL; 
  } 
   
  function setTitle($par){ 
     $this->title = $par; 
  } 
   
  function getTitle(){ 
     echo $this->title . PHP_EOL; 
  } 
} 

$runoob = new Site; 
$taobao = new Site; 
$google = new Site; 

// 呼叫成員函式,設定標題和URL 
$runoob->setTitle( "菜鳥教程" ); 
$taobao->setTitle( "淘寶" ); 
$google->setTitle( "Google 搜尋" ); 

$runoob->setUrl( 'www.runoob.com' ); 
$taobao->setUrl( 'www.taobao.com' ); 
$google->setUrl( 'www.google.com' ); 

// 呼叫成員函式,獲取標題和URL 
$runoob->getTitle(); 
$taobao->getTitle(); 
$google->getTitle(); 

$runoob->getUrl(); 
$taobao->getUrl(); 
$google->getUrl(); 
?>

其中$this更像是一個變化的變數,他代表了當前例項化的物件。上述例子,在runoob物件中,裡面的$this就都是$runoob。

PHP 建構函式

與C++一樣,PHP的建構函式也是用來給物件賦初值的。用法如下:

function __construct($形參1,$形參2,$形參3,......)
    {
         對形參執行的操作;
    }

在例項化物件的時候,就可以將引數寫進去了:

$a = new MyFirstPhpClass(1,2);
$b = new MyFirstPhpClass(2,3);

解構函式

用法和C++一樣,格式如下:

void __destruct(void)

繼承

使用extends關鍵字來繼承一個類。PHP不能多繼承,但是可以使用trait來近似實現一個多繼承。格式如下:

class Child extends Parent
{
程式碼實現部分;
}

這樣Child類就繼承了Parent類。子類在繼承基類的基礎上增加了功能,稱為派生。

方法重寫

如果子類從基類那裡繼承到的方法不能滿足子類的需求,可以對該方法進行重寫。重寫時需要注意的是:子類方法的引數列表應該和基類重名方法的引數列表相同,否則應該成為過載而非重寫。

訪問控制

訪問控制分為三種:public、private和protected。public可以在任何地方被訪問,private只能被所在的類訪問,而protected可以被其所在類、子類、基類三者訪問。

注:類的各種屬性必須被定義為三者之一,如果使用var關鍵字定義,則預設為public。對於方法的訪問控制也是相同的處理方式。

介面

介面可以使某個類必須實現哪些方法,但是這些方法的具體內容不需要在介面中定義。定義介面的關鍵字是interface,格式與定義一個類一樣,但是不需要寫出方法的內容。要實現一個介面,使用 implements 操作符。

注:介面中的所有方法都必須是public型別。

interface myInterface
{
function a($var1,$var2);
}
class myClass implements myInterface
{
function a($var1,$var2)
    {
        return $var1+$var2;        
    }
} 

常量

類中始終保持不變的量可以將其定義為常量。定義常量的時候不需要$符號。常量必須是一個定值。

class myClass{
const constant='001';
}

呼叫常量的時候需要使用::符號,例如 

class myClass{
const constant='001';
}
$a = new myClass();
echo $a::constant;

抽象類

如果一個類中含有抽象方法,那麼這個類必須宣告稱抽象類。(一個抽象類的所有方法中既有可能有抽象方法,也有可能有非抽象方法)被定義成抽象方法的方法只是聲明瞭呼叫方式,並不能實現具體功能。抽象方法是所有子類都需要定義的方法。

注:抽象類不能例項化。

Static 關鍵字

把類的屬性或者是方法宣告成靜態以後就可以不用例項化而直接訪問了。其中,靜態屬性是不能通過一個已經例項化的物件來訪問的,而靜態方法則是可以的。

注:由於靜態方法不需要例項化就能訪問,所以說在靜態方法裡面$this這個偽變數就不好使了。

Final 關鍵字

在PHP中,如果基類(父類)中的一個方法被宣告成了final方法,則在繼承的子類裡面無法對這個方法進行覆蓋。而一個類被宣告稱了Final類時,這個類是不能被繼承的。

呼叫父類構造方法

PHP中子類預設是不會呼叫父類的建構函式的。如果希望子類來呼叫父類的建構函式時,應該在子類的建構函式裡面加上parent::__construct(),這樣就能實現在子類中呼叫父類的構造函數了。

還有一個需要注意

可以用一個變數來動態的對類進行呼叫

class myClass{
var $a=1;
}
$mC="myClass";
echo $mC->a;