funciones con valores por defecto PHP

NeB1

Buenas, tengo una función rollo esto:

function page_get( $page_id = 1  ){
		return (int)$page_id;
}

si la llamas así: page_get(); devuelve 1,

pero si la llamas asín :

page_get( '' ); devuelve 0;

no hay forma de hacer que las variables vacías cojan el valor por defecto de la función sin tener que programarlo dentro de la función?

PD:

porque no puedo hacer function loquesea(string $variable = 'localhost'...) ? me dice que si hago type hintintg tengo que poner null como valor por defecto, enserio?? que clase de xapuza es esa??

B

Un cast int de una string te devuelve 0 a no ser que la string empieze por un numero. Vas a tener que comprobar el valor dentro de la función o parsear la entrada de datos desde fuera.

PiradoIV

Podrías hacerlo así, que además es más versátil:

<?php

function tuMetodo($options = array()) {
  // Todos los defaults que quieras
  $defaults['page_id'] = 1;
  $defaults['magdalenas'] = 'Qué ricas';

  // Unes los $defaults con las opciones 
  // que te pasan al llamar al método, si no
  // existe en $options, usa el de $defaults.
  $options = array_merge($defaults, $options);

  // Lo mostramos para ver qué es lo
  // que está pasando =)
  print_r($options);
}

?>

¡Saludos!

Ninja-edit:
Y claro, para llamar al método...

$options['page_id'] = 33;
tuMetodo($options);
LOc0

Otra forma parecida a #3 añadiendo una especie de type hinting (que en PHP es para objetos de clases "complejas", no funciona con tipos básicos como int o string).

$funciones['caca']=array(1, 2, 3);
function caca($a, $b, $c)
{
	echo '<p>'.implode(' ', array($a, $b, $c)).'</p>';
}


$funciones['pis']=array('hello', 'world');
function pis($a, $b)
{
	echo '<p>'.implode(' ', array($a, $b)).'</p>';
}


function magic($name)
{
	$def_args=$GLOBALS['funciones'][$name];
	
for($i=1, $args=func_get_args(), $tot=min(func_num_args(), count($def_args)+1);
$i<$tot; $i++)
		if(!empty($args[$i]) && gettype($args[$i])==gettype($def_args[$i-1]))
			$def_args[$i-1]=$args[$i];
	
return call_user_func_array($name, $def_args);
}


magic('caca');

magic('caca', 4, 5, 6);

magic('caca', '', 5, 6);

magic('caca', '', 'cadena');

magic('pis');

magic('pis', 1, 'lol');

magic('pis', 1, '', 3, 4, 5, 6);

Salu2 ;)

NeB1

#4 eso es lo que descubrí ayer, que no se podía con tipos básicos. Interesante idea, no sé porque creía que php llevaría algún modo de hacer eso más sencillo...

bLaKnI

LoCo, type hinting es locura! XD

Pon un ejemplo en el que sea interesante usarlo, porfavor. Tengo curiosidad!

LOc0

Hola. La verdad es que el concepto tampoco tiene mucha más miga Es la mítica comprobación de tipos en llamada que hacen otros lenguajes de programación, sólo que PHP, por su naturaleza, te soltará el FATAL ERROR en ejecución, mientras que un C++ por ejemplo te escupirá en la cara al intentar compilar xD ¿Utilidad? Pues control de potenciales errores por "despistes" que en PHP, con su tipado dinámico, pasan más a menudo de lo deseado...

Salu2 ;)

bLaKnI

Ok, ya veo. Es el modo tipico de funciones digamos, especificando tipo.

Type Hints can only be of the object and array (since PHP 5.1) type. Traditional type hinting with int and string isn't supported.

Pues vaya.

...
public function loleame(int polla, string esplendida){
...
}

no funciona. :\

NeB1

Si realmente lo único que quería era saber si había forma de que al hacer

function ($variable = valor);

al invocarla con una variable VACIA, me cogiese el valor por defecto, porque por lo que he comprobado no pasa esto, si no que le pasas una variable vacía a la función, con lo que tenía que añadirle unas cuantas lineas de código pa comprobar.

Usuarios habituales