2011-06-22 379 views
1

將函數名與類匹配被認爲是不好的做法?與類匹配的Php函數名稱

例如在kohana我可以做到以下幾點。

function Model($a,$b){ 
    return new Model($a,$b); 
} 

然後我可以刪除所有引用新的,不必做一個$ temp變量,也沒有工廠混亂。

$temp = new Model('book'); 
$book=$temp->where('title','=','name')->find(); 

或者

$book = Model::factory('book')->where('title','=','name'); 

$book = Model('book')->where('title','=','name'); 

我瞭解全球污染是不好的,這是稍微隱晦在第一次讀,但它有它的好處。

我的意思是,如果其他人定義了一個與類無關的函數,會更混亂,爲什麼不使用該函數?

例如:

$book = new Model('book'); 
// looks so close to the above, it's scary 
$book = Model('book'); 

其他優點缺點還是?

+1

好像你不喜歡PHP語言,所以你正在努力工作。你錯過了一個很好的機會使用這種動機學習另一種語言! – Joe

+0

嘗試將三個難看的名字寫入安全的四個字符,並將寫出代碼的人混淆(「除'new'之外還有什麼功能?」)?編輯@Joe:上次我查了一下,很多語言都需要class new的'new'。有很多事情可以批評PHP的設計,但這不是重要的一個。 – delnan

+1

我並沒有批評PHP的新語法。一般來說。 – Joe

回答

1

我這樣做,偶爾爲之。它有時可以使代碼更具可讀性。

它被稱爲工廠程序。但是,如果它們不那麼淺薄,這是最有意義的。例如,如果根據參數這種方法可能會返回不同的對象(替代佔位符/存根對象):

class User { ... } 

function User($id) { 
    return ($id < 0) ? new PlaceholderUser() : new User($id); 
} // or another *stub object* to support the application flow 

但是,當然,你可以利用它來進行更好的外觀。它基本上比普通的靜態工廠方法更簡潔。但是我會爲你真正使用很多的對象保留這種包裝函數。用每個現有類的包裝調用來填充函數作用域是沒有意義的。

這裏的常見批評是:沒有經驗的開發人員很容易被對象實例化困惑,而沒有new。 (不知道這是否正確,但在這種情況下通常會這樣說)。

0

這是構造函數在PHP v5之前的工作方式(即,而不是將它們命名爲「__construct」),因此您可能不想這樣做。

(編輯:誤解了你的問題,我的漠視沒趕上該函數是在全球範圍內被定義。)

+0

謝謝我很新的PHP(去年左右),所以仍然有趣的知道。 – William

0

恕我直言,這是PHP中的一個錯誤特性!我認爲標識符在其名稱空間中應該是唯一的,不應該將它作爲類或函數來區分。 PHP(屬性?)區別屬性和方法也是一樣。 (曾經嘗試調用封閉存儲爲對象上的屬性?)

也許有人可以看到這些特性,他們似乎沒有任何優點,除了允許醜陋的黑客。

我強烈建議不要使用這種技術。我從來沒有見過一本PHP書(或官方參考書)明確提到這個標識符的「碰撞」。 (糾正我,如果我錯了),但我認爲這不是衆所周知的。正如馬里奧已經指出的那樣,我認爲這是令人困惑和誤導的。

我期望Model()函數實際上做了一些事情,我會很討厭它的定義,只是爲了發現,有人懶得使用new和一個變量!

+0

是的,我注意到它在任何地方都沒有提及。我沒有看到它在php.net上提到或在任何地方的堆棧溢出。我假設什麼時候引入了類,他們希望避免任何名稱與函數的衝突,因此使它們位於不同的名稱空間中。更有趣的是,帶有反斜槓的'命名空間'也污染了一個單獨的命名空間。你可以擁有所有具有相同名稱的函數,類和現在的命名空間。 :)。非常適合黑客入侵。 – William