我有一个方法,通过使用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, tires)签名。这在PHP中可能吗?
使用对象而不是猜测参数:
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
));
除了@Brad Christie的回答,还有其他几个:
-
建议:按常量顺序使用参数,缺少参数的默认值为null
function designGarment($name, $size = null, $fabric = null, $attire = null){ if(!is_null($size)){ } //etc } designGarment('my dress', NULL, FABRICS::SILK, ATTIRES::PARTY);
-
使用对象存储可选参数
$options = new stdClass; $options->size = SIZES::XXL; function designGarment($name, $options = null){ }
-
为每种类型的属性创建单独的对象
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);