22

一个函数(实际上是另一个类的构造函数)需要一个对象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
4

5 回答 5

31

你不能。但是你可以很容易地做到这一点:

function func2(itemp $obj = null)
    if ($obj === null) {
        $obj = new temp('Default');
    }
    // ....
}
于 2011-08-15T12:41:30.313 回答
4

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

func2();
func2(NULL);

如果是这样,更好的解决方案是:

function func2(itemp $obj = NULL)
{

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

  // ...

}
于 2014-12-04T12:01:54.323 回答
2

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
于 2017-07-15T20:54:03.523 回答
2

PHP 8.1 及更高版本

自 PHP 8.1 起,您将能够将对象的新实例定义为函数参数的默认值而不会出错,但有一些限制。

function someFunction(Item $obj = new Item('Default'))
{
    ...
}

文档:PHP RFC:初始化程序中的新功能

于 2021-07-14T11:06:44.330 回答
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)

查看文档以获取更多示例

于 2015-07-09T11:07:26.890 回答