PHP建構函式的繼承分析

2022-05-14 19:23:33 字數 4214 閱讀 1758

在php中php建構函式是乙個提高工作效能的不作做法了,它可以實現自動構造與自動處理一些變數或執行指定函式了,下面給大家全部的介紹了建構函式的用法。

建構函式用法

hp 5 允行開發者在乙個類中定義乙個方法作為建構函式。具有建構函式的類會在每次建立新物件時先呼叫此方法,所以非常適合在使用物件之前做一些初始化工作。

note: 如果子類中定義了建構函式則不會隱式呼叫其父類的建構函式。要執行父類的建構函式,需要在子類的建構函式中呼叫 parent::__construct()。如果子類沒有定義建構函式則會如同乙個普通的類方法一樣從父類繼承(假如沒有被定義為 private 的話)。

example #1 使用新標準的建構函式

**如下

複製**

<?php

class baseclass

}class subclass extends baseclass

}class othersubclass extends baseclass

// in baseclass constructor

$obj = new baseclass();

// in baseclass constructor

// in subclass constructor

$obj = new subclass();

// in baseclass constructor

$obj = new othersubclass();

?>

為了實現向後相容性,如果 php 5 在類中找不到 __construct() 函式並且也沒有從父類繼承乙個的話,它就會嘗試尋找舊式的建構函式,也就是和類同名的函式。因此唯一會產生相容性問題的情況是:類中已有乙個名為 __construct() 的方法卻被用於其它用途時。

與其它方法不同,當 __construct() 被與父類 __construct() 具有不同引數的方法覆蓋時,php 不會產生乙個 e_strict 錯誤資訊。

自 php 5.3.3 起,在命名空間中,與類名同名的方法不再作為建構函式。這一改變不影響不在命名空間中的類。

example #2 constructors in namespaced classes

**如下

複製**

<?php

namespace foo;

class bar

}?>

建物件的時候賦初值。

**如下

複製**

1. //建立乙個人類  

2.  

3. 0class person   

4. 0   

19. //這個人的說話方法   

20. function say()   

21.    

24. }   

25. //通過構造方法建立3個物件$p1、p2、$p3,分別傳入三個不同的實參為姓名、性別和年齡  

26. $p1=new person("張三","男", 20);   

27. $p2=new person("李四","女", 30);   

28. $p3=new person("王五","男", 40);   

29. //下面訪問$p1物件中的說話方法   

30. $p1->say();   

31. //下面訪問$p2物件中的說話方法   

32. $p2->say();   

33. //下面訪問$p3物件中的說話方法   

34. $p3->say();  

輸出結果為:

我的名子叫:張三性別:男我的年齡是:20 

我的名子叫:李四性別:女我的年齡是:30

我的名子叫:王五性別:男我的年齡是:40

建構函式的繼承問題

先來看乙個簡單的例子:

**如下

複製**

<?php

class fruit

然後例項化ceo類,獲得其name成員:

$ceo= new ceo("gonn");

echo $ceo->getname();

將得到如下結果:

my name is gonn

但是,如果子類也有建構函式,那麼當子類例項化時,不論父類是否有建構函式,都會執行子類自己的建構函式。例如,假設除了employee類包含上述建構函式外,ceo類也包含如下建構函式:

**如下

複製**

function  __construct()

不同php版本中建構函式繼承

建構函式中的引用

php 4.x 的建構函式名與類名相同。

子類的建構函式名與子類名相同(廢話)。

在子類裡父類的建構函式不會自動執行。

要在子類裡執行父類的建構函式,必須執行類似以下語句:

$this->[父類的建構函式名()]

例如:**如下

複製**

class base1

}class class1 extends base1

}$c1 = new class1;

php5.x 版本:

php5.0 以上版本對類的功能進行了很大的擴充。類的建構函式統一命名為__construct()。

子類的建構函式名也是__construct()(也是廢話)。

在子類裡父類的建構函式會不會執行,分兩種情況:

1,如子類不定義建構函式 __construct(),則父類的建構函式缺省會被繼承下來,且會自動執行。

2,如子類定義了建構函式 __construct(),因為建構函式名也是__construct(),所以子類的建構函式實際上是覆蓋(override)了父類的建構函式。這時執行的是該子類的建構函式。

這時如果要在子類裡執行父類的建構函式,必須執行類似以下語句:

parent::__construct();

例如:**如下

複製**

class base2

function __destruct()

}class class2 extends base2

}注意 parent::__construct(); 語句不一定必須放在子類的建構函式中。放在子類的建構函式中僅僅保證了其在子類被例項化時自動執行。

php4.0 和 5.0 類建構函式的相容問題:

在 php5.0 以上版本裡,還相容了 4.0 版本的建構函式的定義規則。如果同時定義了4.0的建構函式和 __construct()函式,則__construct() 函式優先。

為了使類**同時相容 php4.0 和 5.0,可以採取以下的方式:

**如下

複製**

class class3

function class3() //for php4.0

}$c3 = new class3;

php建構函式中的引用的內容。

**如下

複製**

<?php

class foo

function echoname()

function setname($name)

}?>

下面來檢查一下用拷貝運算子 = 建立的 $bar1 和用引用運算子 =& 建立的 $bar2 有沒有區別...

copy to clipboard

顯然沒有區別,但實際上有乙個非常重要的區別:$bar1 和 $globalref[0] 並沒有被引用,它們不是同乙個變數。這是因為「new」預設並不返回引用,而返回乙個拷貝。

**如下

複製**

<?php

$bar1 = new foo('set in constructor');

$bar1->echoname();

$globalref[0]->echoname();

/* 輸出:

set in constructor

set in constructor

set in constructor */

$bar2 =& new foo('set in constructor');

$bar2->echoname();

$globalref[1]->echoname();

/* 輸出:

set in constructor

set in constructor

set in constructor */

?>

php建構函式的繼承方法

第一種情況 子類沒有定義建構函式時,預設繼承。例子 class b extends a bb new b 輸出結果 小強 第二種情況 子類定義了建構函式,則不會被繼承。例項 class extends a bb new b 輸出結果 bbbbbb子類 第三種情況 如果需要呼叫父類的建構函式,則可以使...

PHP中類的繼承和建構函式的繼承

php4.x 版本 php 4.x 的建構函式名與類名相同。子類的建構函式名與子類名相同 廢話 在子類裡父類的建構函式不會自動執行。要在子類裡執行父類的建構函式,必須執行類似以下語句 this 父類的建構函式名 例如 class base1 class class1 extends base1 c1...

建構函式的繼承

在父類中定義了2個建構函式,在子類中,也定義了2個建構函式。當執行子類時,可以發現先呼叫父類的建構函式,在呼叫子類的建構函式。實驗四 建構函式的繼承 實驗內容 在父類中,定義了2個建構函式,在子類中,也定義了2個建構函式。編寫 程式顯示父類 子類建構函式的呼叫過程,在子類中實現建構函式的繼承。pac...