2012-04-16 64 views
1

PHP使用__construct()爲新創建的對象設置屬性。根據我的理解,這不是一個真正的構造函數,而是一種方法。爲什麼?爲什麼PHP構造函數是一種方法?

另外 - 對於較少的不一致的語言,如Java或Python,對象是否在調用構造函數之前或之後被實例化?這與PHP的方式有什麼不同?

謝謝!

+1

它爲什麼不是構造函數?它在創建對象時自動調用。 – vikiiii 2012-04-16 01:59:20

+2

它不是構造函數,因爲它沒有爲對象分配內存。 – kindall 2012-04-16 02:00:09

+0

在大多數語言中,我看到構造函數的外觀和行爲都像方法,不管它們在技術上是什麼...... – joshuahealy 2012-04-16 02:00:20

回答

2

這兩種語言都在調用構造函數之前實例化它。在Java中,您可以使用Python self中的this。另外,在Java中,它就像一個方法,除了沒有返回類型。在Python中,語法與方法(__init__)完全相同。

+0

Python也有'__new__',它在創建對象之前被調用。 – agf 2012-04-16 02:22:54

1

它實際上被稱爲magic method,它們是自動調用某些「事件」的方法。 不可思議的方法是最接近事件 PHP。在類實例化時,PHP自動調用__construct

隨着__construct魔術方法是__destruct魔術方法,當腳本關閉它總是被調用,即使exit()die()被調用。

我發現使用這些不同的魔術方法「玩」周圍的東西,使用多個類來了解方法發生的順序。

+1

那麼PHP中的惠普代表哈利波特? – joshuahealy 2012-04-16 02:02:37

+1

@appclay,no,「主頁」,來自個人主頁。但是,這不是那麼令人尷尬嗎? – 2012-04-16 02:05:15

+0

「*自動獲得某些事件的調用*」。你在說什麼事件? – Lion 2012-04-16 02:06:02

0

在每一個面向對象的語言(我知道的,我幾乎在所有這些方面的專家),調用構造函數創建對象後,到初始化內容對象的。構造函數中沒有代碼創建對象,或者可以影響創建過程[1]。 (注意我沒有提到內存;在像C++和Java這樣的語言中,「對象已經創建」意味着它的字段佔用的內存已經被分配,而在Python中「對象已經創建」意味着存在一個字典,將保存對象的屬性,一旦它們被分配)

在我所知道的大多數OO語言中,構造函數也有非常類似於方法的語法,我沒有看到任何概念上的困難,方法在大多數意義上(在Python中,__init__方法在任何意義上都是一種方法;運行時系統在創建後會在新對象上調用它)。


[1] Python有另外一個特徵是確實讓你控制對象創建過程;但是你不用__init__方法(與Java/PHP的構造函數最爲接近的特殊方法)來實現,你可以使用__new__

相關問題