2011-05-25 88 views
0

什麼,我試圖找出是不好的做法,實例化一個類像Class實例變量沒有

new Classname(); 

,因爲我需要運行__construct的類,但我並不需要使用類過去那種。因爲該類中的其他函數將從__construct中調用。

+1

**爲什麼**你想這樣做?它幾乎聽起來像你正在設置單身的默認值.. – 2011-05-25 03:44:33

+0

構造函數的唯一責任是準備對象以供使用。除此之外,它不得做任何事情,它不得有副作用。確實,將所有對象的行爲都放在構造函數中是一種不好的做法。當然也有例外,但是如果你的類不需要析構函數,那麼你沒有達到這樣的例外。 – axiac 2017-10-09 10:16:55

回答

5

它會工作,但作爲維護你的代碼的人,我會被這個超級困惑。一般來說,僅僅實例化一個對象沒有副作用,所以我會假設我可以刪除該行,並且所有東西都可以正常工作。

我建議重新考慮你的代碼的結構,因爲在__construct的代碼中帶有副作用絕對不是標準。

+0

該類在全局範圍內的乾淨輸入中做了什麼,因此它並不真的需要一個變量。那麼,仍然值得把變量放在那裏嗎? – 2011-05-25 03:43:11

+0

克里斯,只是爲了更多的理解。 – gaRex 2011-05-25 05:24:39

+1

@Chris R,更好的解決方案就像'$ input = new InputFilter($ _ POST)',然後使用'$ input ['foo']'而不是'$ _POST ['foo']''。如果不使用'$ _POST',則可能有'$ globalfoo = new InputFilter($ globalfoo)'之類的東西。在函數內部使用全局變量('global'關鍵字)本身幾乎總是一種不好的做法。 – Matthew 2011-05-25 05:33:35

1

考慮使用這樣的事情,而不是:

class Foo 
{ 
    public static function do_something() 
    { 
    // ... 
    } 
} 

Foo::do_something(); 

雖然你有什麼工作,目前尚不清楚有些事情是應該發生的。

(如果你非要用這樣的對象,至少文檔很清楚,只要你做到這一點。)

+0

這也是可能的,可能會比一些變量更多。看起來,如果您將邏輯移至__construct,那麼您的代碼在這裏功能更強大,而不是OOP。 – gaRex 2011-05-25 05:25:31

0

那麼讓我們只想說,我們有一個叫做的HelloWorld到一個文件中的類名。

文件class.HelloWorld.php

class HelloWorld { 

    function __construct() 
    { 
    } 

    public function doSomething(){ 
     echo "new HelloWorld()->doSomething() was called"; 
    } 

    public function anotherMethod(){ 
     echo "new HelloWorld()->anotherMethod() was called"; 
    } 
} 

現在你可以實例上運行的類,但不保存到一個變量。

require('class.HelloWorld.php'); 
// you can just instantiate it and the constructur will be called automatically 
(new HelloWorld()); 

// or you can instantiate it and call other methods 
(new HelloWorld())->doSomething(); 

我不知道如果垃圾收集將刪除實例化類或沒有,但我相信,因爲這些類不保存到這會不會在內存的某個地方保存一個變量,那將是完美的。