避免长类常量作为参数-PHP
例如:避免长类常量作为参数-PHP,php,oop,coding-style,Php,Oop,Coding Style,例如: class Vendor_ClassName_Helper { CONST FIRST_OPTION = 1; CONST SECOND_OPTION = 2; public function __construct($option, $otherArgument) { } } 客户端代码: $obj = new Vendor_ClassName_Helper(Vendor_ClassName_Helper::FIRST_OPTION, $var)
class Vendor_ClassName_Helper {
CONST FIRST_OPTION = 1;
CONST SECOND_OPTION = 2;
public function __construct($option, $otherArgument) {
}
}
客户端代码:
$obj = new Vendor_ClassName_Helper(Vendor_ClassName_Helper::FIRST_OPTION, $var);
有什么好方法可以避免排长队(这是一个很短的例子)?也许还有其他方法可以实现相同的功能?我通过将参数分解为它们自己的块来避免长行,并提高大多数语言的可读性
$obj = new Vendor_ClassName_Helper(
Vendor_ClassName_Helper::FIRST_OPTION,
$var
);
但在我看来,有两种选择并不总是值得的。遗憾的是,静态常量实际上无法更改,您当然希望它们保持描述性
你这里的东西还不错:)我认为没有更好的方法(没有动态的方法):
我认为清晰比简短的代码好。你可以试着用不同的词来表达相同或不同的形式。对于您的示例,它似乎并不像Omega指出的那样糟糕,而且他的在多行上拆分声明的方法也很好 还有一个技巧:根据选项常量的作用,您可能希望使用工厂方法而不是new关键字 比如说,
class Example {
private function __construct() { }
public static method createA(..) {
//configure for mode A
$cls = new self;
return $cls;
}
public static method createB(..) {
//configure for mode B
$cls = new self;
return $cls;
}
}
$x = Example::createA();
如果不对类或常量的名称使用较短的名称(并且使您的代码无法理解,这是您绝对不希望看到的),不,我认为没有办法——至少在PHP<5.3中没有 PHP5.3将名称空间添加到PHP中;有了这些,你可能会得到更短/更好的东西;但这意味着要使用PHP5.3,这并不是许多托管公司所建议的(5.3.0是在今年6月底发布的,所以它可能需要一段时间才能在各地上市……) 有关PHP中名称空间的更多信息(仅举几个链接):
- 你可能也感兴趣
class Vendor_ClassName_Helper {
public function __construct($otherArgument) {
}
}
class Vendor_ClassName_Helper_First extends Vendor_ClassName_Helper {
}
class Vendor_ClassName_Helper_Second extends Vendor_ClassName_Helper {
}
这种方法如何适用于Zend_Auth_Result这样的类?我想这是一个好答案。但是我一直在想(而且还没有写出来),客户机代码有一个类Zend_Auth_Result_Success是相当尴尬的,然后询问每个案例是否例如if$Result->getCode()==Zend_Auth_Result::FAILURE_IDENTITY_找不到。__construct()的长常量名称已经消失,但现在您必须引用另一个类的常量,而不是您得到的类(如果它是接口常量,则不同)。这表明代码存在另一个问题。您应该用多态性替换条件。请参阅:客户机代码具有条件,如ZF手册中所述:您是指类似于构建器模式的东西吗?不,只是一个工厂方法而不是构造函数。有时,您可能能够命名该方法,这样即使它通过调用该方法进行通信,您也可以通过这种方式配置对象,它仍然比使用某个常量短。
class Vendor_ClassName_Helper {
public function __construct($otherArgument) {
}
}
class Vendor_ClassName_Helper_First extends Vendor_ClassName_Helper {
}
class Vendor_ClassName_Helper_Second extends Vendor_ClassName_Helper {
}