2013年3月13日 星期三

PHP類別與物件

類別的定義方法

class 類別名稱
{
  var $a;
  var $b;  //定義類別的變數

  //定義類別的函數
  function 函數名稱1(參數1, 參數2)
  {
    :
  }


  function 函數名稱2(參數1, 參數2)
  {
    :
  }


}

在類別中如果要呼叫類別的變數時必須使用 $this->變數名稱,
列如在上面的類別要呼叫 $a 必須使用 $this->a (後面的 a 不用加 $)

類別寫完之後必須宣告為物件才能使用,假如上述類別名稱為 class1,
我們必須先宣告一個物件:

  $test = new class1;

這樣就可以使用上述類別的功能了,物件可以呼叫類別所有開放的變數以及函數,
以上述物件為例子:

  $test->a;  可以取得參數 a
  $test->函數名稱1;  可以呼叫函數 1



建構式(__construct)

設定類別的時候,可以設定建構式,當物件被宣告的時候,建構式就會同時被觸發。
如果建構式必須輸入參數,當宣告物件的時候要一起輸入。


class point
{
var $x;
var $y;

function __construct($var1=0, $var2=0)
{
$this->x = $var1;
$this->y = $var2;
}

function show_center()
{
echo "The center is: ".$this->x."|".$this->y;
}

}

$point1 = new point(2,1); (如果不輸入值,會跑預設)
$point1->show_center();  (會列印出中心點)


繼承(inheritance)的寫法

類別是可以繼承的,繼承父類別的子類別會擁有父類別已經設定好的參數。
繼承的方法是使用 extend


class circle extends point
{
var $radius;
function __construct($var1=0, $var2=0, $var3=1)
{
parent::__construct($var1, $var2);
$this->radius = $var3;
}
function show_info()
{
echo "center is: ".$this->x."|".$this->y. " and radius is: ".$this->radius;
}
}

$point1 = new circle(2,1,3);

$point1->show_center();
$point1->show_info();


新的子類別 circle ,一樣可以呼叫父類別 point 的參數以及函式。


子類別也可以寫自己的建構式,但是如果子類別有建構式就不會執行父類別的建構式,如果需要執行,就在建構式裡面使用 parent::__construct(); 這樣就會呼叫父類別的建構式。如果子類別沒有建構式,就會直接繼承父類別的建構式。



多型(polymorphism)的寫法

子類別可以覆蓋父類別的函數,改成執行自己的方法,這種繼承方式稱為多型。


class circle extends point
{
var $radius;
function __construct($var1=0, $var2=0, $var3=1)
{
parent::__construct($var1, $var2);
$this->radius = $var3;
}
function show_center()
{
echo "center is: ".$this->x."|".$this->y. " and radius is: ".$this->radius;
}
}


$point1 = new circle(2,1,3);
$point1->show_center();

子類別會直接執行自己的 show_center() 而不是父類別的




另外如果再子類別的程式中想要呼叫擁有相同名稱的父類別函數都可以使用 parent:: 加上函數名稱來呼叫。


class circle extends point
{
var $radius;
function __construct($var1=0, $var2=0, $var3=1)
{
parent::__construct($var1, $var2);
$this->radius = $var3;
}
function show_center()
{
parent::show_center();
echo "center is: ".$this->x."|".$this->y. " and radius is: ".$this->radius;
}
}







沒有留言:

張貼留言