Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
避免长类常量作为参数-PHP_Php_Oop_Coding Style - Fatal编程技术网

避免长类常量作为参数-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 {
}