2011-05-25 90 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(); 

我不知道如果垃圾收集将删除实例化类或没有,但我相信,因为这些类不保存到这会不会在内存的某个地方保存一个变量,那将是完美的。