php函数如何将默认值设置为object?

php函数如何将默认值设置为object?,php,object,default-arguments,Php,Object,Default Arguments,函数(实际上是另一个类的构造函数)需要一个class temp的对象作为参数。所以我定义了interface itemp,并将itemp$obj作为函数参数。这很好,我必须将类temp对象传递给我的函数。但是现在我想为这个itemp$obj参数设置默认值。如何做到这一点?还是不可能? 我将使用测试代码来澄清: interface itemp { public function get(); } class temp implements itemp { private $_var;

函数(实际上是另一个类的构造函数)需要一个
class temp
的对象作为参数。所以我定义了
interface itemp
,并将
itemp$obj
作为函数参数。这很好,我必须将
类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

你不能。但你可以轻松做到:

function func2(itemp $obj = null)
    if ($obj === null) {
        $obj = new temp('Default');
    }
    // ....
}

arnaud576875回答的一个可能问题是,在某些情况下,您可能希望允许
NULL
作为指定参数,例如,您可能希望以不同方式处理以下内容:

func2();
func2(NULL);
如果是这样,更好的解决方案是:

function func2(itemp $obj = NULL)
{

  if (0 === func_num_args())
  {
    $obj = new temp('Default');
  }

  // ...

}

在这种情况下,您可以使用我的微型库,例如:

function func2(itemp $obj = null)
    $obj = ValueResolver::resolve($obj, new temp('Default'));
    // ....
}
不要忘记使用namespace
使用LapaLabs\ValueResolver\Resolver\ValueResolver

还可以进行类型转换,例如,如果变量的值应为
整数
,请使用以下方法:

$id = ValueResolver::toInteger('6 apples', 1); // returns 6
$id = ValueResolver::toInteger('There are no apples', 1); // returns 1 (used default value)
检查以获取更多示例,因为您可以简单地使用传递类作为参数,如下所示:

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

感谢搜索php方法默认值后,我不认为我可以将对象与null进行比较。这有意义吗?唯一有效的参数值是
null
itemp
的实现。在为缺少的值(
null
)传递标记时,没有行为差异(或者至少从API的角度来看应该是这样),也没有任何值。我同意,如果参数不会被类型暗示,这在某些情况下实际上是有用的。如果你没有传递参数,那么你是故意这样做的,因此你可能希望它执行一些默认行为。如果您传递的是
NULL
参数,那么它很可能需要
itemp
实现,因此您可能希望它记录错误和/或抛出异常。我喜欢。不知道我是否会支持它,但谁在乎…:)在这种情况下,你可以使用我的小图书馆,请检查我的答案,谢谢!遗憾的是,它不能与类型提示一起工作:函数func2(SomeInterface$class=SomeObject::class)产生了一个致命的错误:“类类型参数的默认值只能为NULL”(使用PHP7.2测试)