¿Funciona php como configurar valor por defecto como objeto?
object default-arguments (4)
Podría usar mi pequeña biblioteca ValueResolver en este caso, por ejemplo:
function func2(itemp $obj = null)
$obj = ValueResolver::resolve($obj, new temp(''Default''));
// ....
}
y no olvide usar el espacio de nombres use LapaLabs/ValueResolver/Resolver/ValueResolver;
También hay capacidad para encasillar, por ejemplo, si el valor de su variable debería ser integer
, entonces use esto:
$id = ValueResolver::toInteger(''6 apples'', 1); // returns 6
$id = ValueResolver::toInteger(''There are no apples'', 1); // returns 1 (used default value)
Compruebe la ValueResolver para más ejemplos
Una función (en realidad un constructor de otra clase) necesita un objeto de class temp
de class temp
como argumento. Así que defino la interface itemp
e itemp $obj
como argumento de función. Esto está bien, debo pasar objetos de class temp
a mi función. Pero ahora quiero establecer un valor predeterminado para este argumento itemp $obj
. ¿Cómo lograr esto? ¿O acaso no es posible?
Pondré el código de prueba para aclarar:
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
Un posible problema con la respuesta de arnaud576875 es que, en algunos casos, es posible que desee permitir NULL
como un parámetro específico, por ejemplo, podría desear que lo siguiente se maneje de manera diferente:
func2();
func2(NULL);
Si es así, una mejor solución sería:
function func2(itemp $obj = NULL)
{
if (0 === func_num_args())
{
$obj = new temp(''Default'');
}
// ...
}
Usted no puede Pero puedes hacerlo fácilmente:
function func2(itemp $obj = null)
if ($obj === null) {
$obj = new temp(''Default'');
}
// ....
}
desde php 5.5 , simplemente puede usar la ::class
para pasar una clase como parámetro de la siguiente manera:
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