避免长类常量作为参数 - PHP

时间:2009-07-21 11:14:16

标签: 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);

避免长线的任何好方法(这是一个相当简短的例子)?也许其他方法可以实现相同的目标?

5 个答案:

答案 0 :(得分:4)

我认为清晰度比短码更好。您可以尝试考虑表达相同或不同形式的不同词语。对于你的例子,正如欧米茄指出的那样,它看起来并不是很糟糕,而且他在多行上分割声明的方法也很好。

这是另一个技巧:根据您的选项常量所做的,您可能希望使用工厂方法而不是new-keyword。

例如,

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();

答案 1 :(得分:3)

我通过将参数分解为各自的块来避免长线并提高大多数语言的可读性......

$obj = new Vendor_ClassName_Helper(
    Vendor_ClassName_Helper::FIRST_OPTION, 
    $var
);

但在我看来,两种选择并不总能保证。遗憾的是,静态常量无法真正改变,你当然希望它们保持描述性。

你在这里所做的并不是那么糟糕:)

答案 2 :(得分:2)

如果您将常量传递给构造函数,则建议您应该创建子类:

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 {
}

答案 3 :(得分:1)

没有使用较短的名称为类或常量的名称​​(并使你的代码无法理解,这是你绝对不想要的东西),不,我认为没有办法 - 至少,不是PHP< 5.3

PHP 5.3为PHP添加了名称空间;有了这些,你可能会变得更短/更好;但这意味着使用PHP 5.3,这是许多托管公司没有提出的(5.3.0是在今年6月底发布的,所以它可能需要一段时间才能在其他地方可用......)

有关PHP 中名称空间的更多信息(以及仅引用几个链接)

答案 4 :(得分:0)

我认为没有更好的方法(没有动态方式):

class LongClassName
{
    const B = 3;
}

class LCN
{
    const B = LongClassName::B;
}

echo LCN::B;