2011-08-15 18 views
16

Una función (en realidad constructor de otra clase) necesita un objeto de class temp como argumento. Así que defino interface itemp e incluyo itemp $obj como argumento de función. Esto está bien, debo pasar objetos class temp a mi función. Pero ahora quiero establecer el valor predeterminado para este argumento itemp $obj. ¿Cómo lograr esto? ¿O acaso no es posible?
voy a poner el código de prueba para aclarar:php function ¿cómo establecer el valor predeterminado como objeto?

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 
+0

usted podría utilizar mi pequeña biblioteca [ValueResolver] (https://github.com/LapaLabs/ValueResolver) en este caso, comprobar mi respuesta, por favor –

Respuesta

26

No se puede. Pero se puede hacer fácilmente que:

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

gracias [encontrado esta] (http: // stackoverflow.com/questions/2224014/php-default-function-argument-as-a-t-variable/2224044#2224044) después de buscar los valores predeterminados del método php, no creo que pueda comparar el objeto con nulos. – Sudhi

3

Un posible problema con la respuesta de arnaud576875 es que en algunos casos es posible que desee para permitir NULL como parámetro especificado, por ejemplo, es posible que desee para el siguiente para ser manejado de manera diferente:

func2(); 
func2(NULL); 

Si es así sería una solución mejor:

function func2(itemp $obj = NULL) 
{ 

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

    // ... 

} 
+1

¿Tiene esto sentido? Los únicos valores de parámetros válidos son 'null' e implementaciones de' itemp'. Hay (o al menos debería ser desde una perspectiva API) ninguna diferencia de comportamiento al pasar un marcador por un valor ausente ('null') y ningún valor en absoluto. Estoy de acuerdo, si el parámetro no se escribe a máquina, esto es realmente útil en algunos casos. – Rangad

+1

Si no está pasando un parámetro, lo hace intencionalmente, por lo que es posible que desee realizar algún comportamiento predeterminado. Si está pasando un parámetro 'NULL', es probable que esté esperando una implementación' itemp' y, por lo tanto, es posible que desee registrar un error y/o lanzar una excepción. – MichaelRushton

+0

furtivo, de esa manera estás introduciendo un poco de sobrecarga a php. Me gusta. No estoy seguro si lo endosaría, pero a quién le importa ... :) – VolkerK

0

usted podría utilizar mi pequeña biblioteca ValueResolver en este caso, por ejemplo:

function func2(itemp $obj = null) 
    $obj = ValueResolver::resolve($obj, new temp('Default')); 
    // .... 
} 

y no se olvide de utilizar espacio de nombres use LapaLabs\ValueResolver\Resolver\ValueResolver;

Hay También posibilidad de encasillamiento, por ejemplo, si el valor de la variable debe ser integer, a fin de utilizar esto:

$id = ValueResolver::toInteger('6 apples', 1); // returns 6 
$id = ValueResolver::toInteger('There are no apples', 1); // returns 1 (used default value) 

Compruebe el docs para más ejemplos

0

desde php 5.5 sólo tiene que utilizar el ::class a pasar una clase como una 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 
Cuestiones relacionadas