基本概念

class

每個類的定義都以關鍵字 class 開頭,後面跟著類名,可以是任何非 PHP 保留字的名字。後面跟著一對花括號,裡面包含有類成員和方法的定義。偽變量 $this 可以在當一個方法在物件內定呼叫時使用。$this 是一個到呼叫物件(通常是方法所屬於的對象,但也可以是另一個對象,若果該方法是從第二個對象內靜態呼叫的話)的引用。看下面例子:

<?php
class A
{
    function 
foo()
    {
        if (isset(
$this)) {
            echo 
'$this is defined (';
            echo 
get_class($this);
            echo 
")\n";
        } else {
            echo 
"\$this is not defined.\n";
        }
    }
}

class 
B
{
    function 
bar()
    {
        
A::foo();
    }
}

$a = new A();
$a->foo();
A::foo();
$b = new B();
$b->bar();
B::bar();
?>

上例將輸出:

$this is defined (a)
$this is not defined.
$this is defined (b)
$this is not defined.

例子 19-1. 簡單的類定義

<?php
class SimpleClass
{
    
// 成員聲明
    
public $var 'a default value';

    
// 方法聲明
    
public function displayVar() {
        echo 
$this->var;
    }
}
?>

new

要建立一個對象的案例,必須建立一個新對象並將其賦給一個變量。當建立新物件時該物件總是被賦值,除非該物件定義了構造函數並且在出錯時拋出了一個異常

例子 19-2. 建立一個案例e

<?php
$instance 
= new SimpleClass()
?>

當把一個物件已經建立的案例賦給一個新變量時,新變量會訪問同一個案例,就和用該物件賦值一樣。此行為和給函數傳遞入案例時一樣。可以用複製成影像檔給一個已建立的對象建立一個新案例。

例子 19-3. 物件賦值

<?php
$assigned   
=  $instance;
$reference  =& $instance;

$instance->var '$assigned will have this value';

$instance null// $instance and $reference become null

var_dump($instance);
var_dump($reference);
var_dump($assigned);
?>

上例將輸出:

NULL
NULL
object(SimpleClass)#1 (1) {
   ["var"]=>
     string(30) "$assigned will have this value"
}

extends

一個類可以在聲明中用 extends 關鍵字繼承另一個類的方法和成員。不能增加多個類,只能繼承一個基類。

被繼承的方法和成員可以通過用同樣的名字重新聲明被覆蓋,除非父類定義方法時使用了 final 關鍵字。可以通過 parent:: 來訪問被覆蓋的方法或成員。

例子 19-4. 簡單的類繼承

<?php
class ExtendClass extends SimpleClass
{
    
// Redefine the parent method
    
function displayVar()
    {
        echo 
"Extending class\n";
        
parent::displayVar();
    }
}

$extended = new ExtendClass();
$extended->displayVar();
?>

上例將輸出:

Extending class
a default value