编码标准:大量的论点

use*_*310 14 php oop

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

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

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

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

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

cle*_*tus 16

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

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

$o = new MyClass(array(
  'uCode' => 'some value',
  'uText' => 'another value',
));
Run Code Online (Sandbox Code Playgroud)

比较一下:

$o = new MyClass('some value', '', '', '', '', 'another value');
Run Code Online (Sandbox Code Playgroud)

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


Fra*_*mer 7

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

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

public function __construct($uCode = '', $uName = '') {}
public function setUTime($uTime) {}
public function setUArea($uArea) {}
...
Run Code Online (Sandbox Code Playgroud)

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

$object = new MyObject($code, $name);
$object->setUTime($time)->setUArea($area)->...;
Run Code Online (Sandbox Code Playgroud)