我有一个方法,通过利用func_get_args来确定方法签名,支持复杂的“重载”。但是,在某些情况下,参数类型太模糊,无法区分。
designGarment('my shirt', SIZES::XXL, FABRICS::COTTON);
designGarment('my dress', FABRICS::SILK, ATTIRES::PARTY);
在上面的示例中,两个方法签名都解析为STRING,INT,INT,因为SIZES,FABRICS和ATTIRES是具有为其各自属性定义的整数常量的类。我希望能够区分(STRING,SIZES,FABRICS)签名和(STRING,FABRICS,ATTIRES)签名。这可能在PHP吗?
答案 0 :(得分:2)
使用对象而不是猜测参数:
class Garment
{
var $name;
var $size;
var $fabric;
var $attires;
}
$Garment = new Garment(...);
function designGarment($Garment);
或者使用键/值对数组来显式指定参数及其值:
designGarment(array(
'name' => 'my dress',
'fabric' => FABRICS::SILK,
'attires' => ATTIRES::PARTY
));
答案 1 :(得分:0)
除了@Brad,克里斯蒂回答其他人很少:
推荐:按常数顺序使用参数,将null作为缺失值的默认值
function designGarment($name, $size = null, $fabric = null, $attire = null){
if(!is_null($size)){ }
//etc
}
designGarment('my dress', NULL, FABRICS::SILK, ATTIRES::PARTY);
使用Object存储可选参数
$options = new stdClass;
$options->size = SIZES::XXL;
function designGarment($name, $options = null){
}
为每种类型的财产制作separeate对象
function designGarment(){
foreach(func_get_args() as $arg){
if($arg instanceof Size){ }
}
}
designGarment($name, new Size('XXL'), new Fabric('WOOL'));
与上面类似,但是对于每种类型和属性值都有单独的对象(不推荐,但我见过一些使用它的情况)
class Size{ public $size; }
class SizeXXL extends Size{
public function __construct(){ $this->size = SIZES::XXL; }
}
designGarment($name, new SizeXXL);