编码标准:大量的论点

时间:2009-05-28 23:46:54

标签: php oop

嘿,我是大学毕业生。我正在开发一个项目,我希望最终能够由其他人维护。我在这个项目中遇到了令人烦恼的情况,那就是需要很多私有变量的对象,因此需要非常长的构造函数。

除了变量命名之外,没有强制执行任何编码标准。我想知道如何应对这种情况。有时我担心将来会在dailywtf上看到我自己的一些代码!

我试图将其中一些争论纳入其他课程,但在这种情况下它并没有真正有意义。

这是完全没有问题还是应该而且容易纠正的事情?

public function __construct($uCode = '', $uName = '', $uTime = '', $uArea = '', $uDomain = '', $uText = '', $uId = '', $uNum = '', $uVideo = 0, $uAudio = 0, $uImage = 0){

6 个答案:

答案 0 :(得分:16)

一般来说,如果你有超过4个参数,最好使用临时对象或数组。通常很多参数都是可选的,这可能会非常尴尬并且很容易出错。所以:

class MyClass {
  public function __construct($options) { ... }
...
}

$o = new MyClass(array(
  'uCode' => 'some value',
  'uText' => 'another value',
));

将其与:

进行比较
$o = new MyClass('some value', '', '', '', '', 'another value');

请注意数组版本仅包含您要传递的内容。

答案 1 :(得分:7)

我倾向于倾向于cletus的解决方案,但另一种方法是对构造函数中不一定非必需的任何值使用set()函数。

例如,如果需要$ uCode和$ uName,但其余的是可选的......

public function __construct($uCode = '', $uName = '') {}
public function setUTime($uTime) {}
public function setUArea($uArea) {}
...

让你的setter返回$ this有时很有用,所以你可以链接命令,如下所示:

$object = new MyObject($code, $name);
$object->setUTime($time)->setUArea($area)->...;

答案 2 :(得分:5)

使用构建器模式..此处

http://en.wikipedia.org/wiki/Builder_pattern

答案 3 :(得分:0)

如果您有太多参数,则表明您的方法可能做得太多了。尝试将任务分解为许多较小的任务并重构该方法。如果失败,传入一个包含所有参数的类应该没问题。

答案 4 :(得分:0)

您可以将多个参数分配给数组,并将该数组传递给__construct,这样您就只能拥有一个数组参数。

答案 5 :(得分:0)

你可以使用魔术方法

class abc {

    private $allowed = array(
        'uCode',
        'uId'
    );

    public function __set($name, $value) {
        if (in_array($name, $this->allowed)) {
            $this->$name = $value;
        }
    }

    public function __call($name, $args) {
        if (substr($name, 0, 4) == "set_") {
            $var = substr($name, 4);
            if (in_array($var, $this->allowed)) {
                $this->$var = $args[0];
            }
        }
    }

}

$abc = abc();
$abc->uCode = 123;
$abc->set_uId(123);