2011-08-31 36 views
0

我有一种方法通过利用func_get_args来确定方法签名来支持复杂的“重载”。然而,在某些情况下,参数类型过于模糊不清。对PHP“超载”方法签名的歧义消除

designGarment('my shirt', SIZES::XXL, FABRICS::COTTON); 
designGarment('my dress', FABRICS::SILK, ATTIRES::PARTY); 

在上面的例子中,两个方法签名解析为字符串,整数,INT因为尺寸的织物和只装是与各自的属性定义的整数常量类。我希望能够区分(STRING,SIZES,FABRICS)签名和(STRING,FABRICS,ATTIRES)签名。这在PHP中可能吗?

回答

0

除了@Brad克里斯蒂答案有几个其他:

  1. 推荐:使用参数的常数和空作为de故障值失踪者

  2. 使用对象存储可选参数

    $options = new stdClass; 
    $options->size = SIZES::XXL; 
    function designGarment($name, $options = null){ 
    
    } 
    
  3. 让separeate对象为所有类型的物业

    function designGarment(){ 
        foreach(func_get_args() as $arg){ 
         if($arg instanceof Size){ } 
        } 
    } 
    designGarment($name, new Size('XXL'), new Fabric('WOOL')); 
    
  4. 与上述类似,但有为每个类型和属性值单独的对象(不推荐,但我已经看到一些使用这种情况)

    class Size{ public $size; } 
    class SizeXXL extends Size{ 
        public function __construct(){ $this->size = SIZES::XXL; } 
    } 
    designGarment($name, new SizeXXL); 
    
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 
)); 
+0

感谢您的回复。我应该澄清,我正在构建一个框架,有问题的方法确实允许单个数组参数提供键/值对,但我想给出选项不要使用数组。你的第一个例子违背了我试图实现的目的,我不妨将构造函数的参数直接传递给designGarment或者为你的Garment对象公开一个“设计”方法。 – leo

+1

@leo:那么,PHP不支持命名参数,所以我不知道除了设置(非常分离的)整数值到不同的常量以及检查它们是否属于该属性范围。例如“如果它在1-100之间,它必须是FABRICS ::值,250-500是ATTIRES等。 –

+0

是的,我正在考虑一些与此相关的内容,或许还会分隔字符串ala FAB_1,FAB_2等。 – leo