一个函数(实际上是另一个类的构造函数)需要一个class temp
对象作为参数。所以我定义interface itemp
并包含itemp $obj
作为函数参数。这很好,我必须将class temp
个对象传递给我的函数。但现在我想将默认值设置为此itemp $obj
参数。怎么做到这一点?或者是不可能的?
我将把测试代码弄清楚:
interface itemp { public function get(); }
class temp implements itemp
{
private $_var;
public function __construct($var = NULL) { $this->_var = $var; }
public function get() { return $this->_var ; }
}
$defaultTempObj = new temp('Default');
function func1(itemp $obj)
{
print "Got : " . $obj->get() . " as argument.\n";
}
function func2(itemp $obj = $defaultTempObj) //error : unexpected T_VARIABLE
{
print "Got : " . $obj->get() . " as argument.\n";
}
$tempObj = new temp('foo');
func1($defaultTempObj); //Got : Default as argument.
func1($tempObj); //Got : foo as argument.
func1(); //error : argument 1 must implement interface itemp (should print Default)
//func2(); //could not test as i can't define it
答案 0 :(得分:27)
你做不到。但你可以很容易地做到这一点:
function func2(itemp $obj = null)
if ($obj === null) {
$obj = new temp('Default');
}
// ....
}
答案 1 :(得分:4)
arnaud576875的答案可能存在的问题是,在某些情况下,您可能希望允许NULL
作为指定参数,例如您可能希望以不同方式处理以下内容:
func2();
func2(NULL);
如果是这样,更好的解决方案是:
function func2(itemp $obj = NULL)
{
if (0 === func_num_args())
{
$obj = new temp('Default');
}
// ...
}
答案 2 :(得分:1)
自php 5.5起,您只需使用::class
将一个类作为参数传递,如下所示:
function func2($class = SomeObject::class) {
$object = new $class;
}
func2(); // will create an instantiation of SomeObject class
func2(AnotherObject::class); // will create an instantiation of the passed class
答案 3 :(得分:1)
自 PHP 8.1 起,您将能够毫无错误地将对象的新实例定义为函数参数的默认值,但有一些限制。
function someFunction(Item $obj = new Item('Default'))
{
...
}
答案 4 :(得分:0)
在这种情况下,您可以使用我的小型库ValueResolver,例如:
function func2(itemp $obj = null)
$obj = ValueResolver::resolve($obj, new temp('Default'));
// ....
}
并且不要忘记使用命名空间use LapaLabs\ValueResolver\Resolver\ValueResolver;
还可以进行类型转换,例如,如果变量的值应该是integer
,那么请使用:
$id = ValueResolver::toInteger('6 apples', 1); // returns 6
$id = ValueResolver::toInteger('There are no apples', 1); // returns 1 (used default value)
查看docs了解更多示例