Ответ 1
Вы не можете. Но вы можете легко это сделать:
function func2(itemp $obj = null)
if ($obj === null) {
$obj = new temp('Default');
}
// ....
}
Функция (фактически конструктор другого класса) нуждается в объекте 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
Вы не можете. Но вы можете легко это сделать:
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');
}
// ...
}
В этом случае вы можете использовать мою крошечную библиотеку 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 для получения дополнительных примеров
поскольку 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