Функция PHP, как установить значение по умолчанию в качестве объекта? - PullRequest
16 голосов
/ 15 августа 2011

Функция (фактически конструктор другого класса) нуждается в объекте 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 ]

27 голосов
/ 15 августа 2011

Вы не можете.Но вы можете легко сделать это:

function func2(itemp $obj = null)
    if ($obj === null) {
        $obj = new temp('Default');
    }
    // ....
}
4 голосов
/ 04 декабря 2014

Возможная проблема с ответом arnaud576875 заключается в том, что в некоторых случаях вы можете захотеть разрешить NULL в качестве указанного параметра, например, Вы можете пожелать, чтобы следующее обрабатывалось по-другому:

func2();
func2(NULL);

Если так, то лучшим решением будет:

function func2(itemp $obj = NULL)
{

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

  // ...

}
1 голос
/ 15 июля 2017

, начиная с 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
0 голосов
/ 09 июля 2015

Вы можете использовать мою крошечную библиотеку 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)

Проверьте документы для большего количества примеров

...