2011-01-20 9 views
5

Viniendo de C# Estoy acostumbrado a sobrecargar mis métodos con parámetros de tipos variables. Como no se puede hacer esto en PHP , que a menudo crean métodos como el siguiente ejemplo, que acepta una variable, entonces yo verificar el tipo y actuar en consecuencia:¿Está permitiendo que una variable de función PHP sea una cadena o una matriz, un patrón o antipatrón?

showLength('one'); 
showLength(array(
    'one', 
    'two', 
    'three' 
)); 

function showLength($stringOrArray) { 
    $arr = array(); 
    if(is_array($stringOrArray)) { 
     $arr = $stringOrArray; 
    } else if(is_string($stringOrArray)) { 
     $arr[] = $stringOrArray; 
    } else { 
     //exception 
    } 
    foreach ($arr as $str) { 
     echo strlen($str).'<br/>'; 
    } 
} 

de salida:

3 
3 
3 
5 
4 

Esto me da la misma funcionalidad que en C#, pero parece un poco desordenado, como si hubiera una mejor manera.

¿Es esta la forma aceptada de sobrecargar el método en PHP (5.3) o hay una forma mejor?

Respuesta

9

Sé que muchos frameworks hacen esto para ciertas funciones donde tiene sentido, como lo hacen algunas de las funciones básicas de PHP. La diferencia entre los "buenos" usos y los "malos" me sirve es la documentación (docblock). La documentación debe indicar que el parámetro es de tipo mixto y los diferentes tipos de variables aceptables.

Por ejemplo:

<?php 
/** 
    * Function used to assign roles to a user 
    * @param int $user_id The user's id 
    * @param mixed $role Either a string name of the role 
    *      or an array with string values 
    * 
    * @return bool on success/failure 
    */ 
function addRole($user_id, $role) { 
    if (!is_array($role)) { 
    $role = array($role); 
    } 

    foreach($role as item) { 
    Model::addRole($item); 
    } 

    return true; 
} 
+0

Sí, CodeIgniter lo hace en muchas de sus funciones y funciona bien y ahorra una gran cantidad de código. Mientras esté documentado lo recomiendo. Solo recuerde devolver el tipo esperado. Si pasé un número entero a un modelo, espero recuperar un objeto. Si pasé una matriz de enteros, espero una serie de objetos (tal vez indexados por ID). – Sid

3

Como usted ha dicho, no hay realmente un método de aceptar PHP tipo de múltiples parámetros antes como C# hace, pero esto no debería causar problemas siempre y cuando se comprueba de qué tipo es el los parámetros son antes de hacer cualquier cosa con ellos.

Muchas funciones PHP nativas aceptan parámetros de tipo mixto, p. Ej. str_replace().

3

No me gusta vencer a un caballo muerto, pero aun así, voy a pesar aquí.

No lo consideraría un antipatrón; como señala @Merijn, muchas funciones PHP nativas aceptan parámetros de tipo mixto. Además, muchas circunstancias como la suya requieren que, para ser sucinto, la función acepte un elemento, o una colección, de un tipo dado en lugar de dividirlo en dos funciones.

La conversión a (array) es una manera rápida y fácil de conseguir esta funcionalidad:

function printStuff($stuff) 
{ 
    foreach((array) $stuff as $key => $value) { 
     echo sprintf('%d : %s', $key, $value) . PHP_EOL; 
    } 
} 

printStuff("foo"); 
// 0 : foo 

printStuff(array("foo", "bar", "qux")); 
// 0 : foo 
// 1 : bar 
// 2 : qux 

Usando $foo = (array) $foo; es mejor que $foo = array($foo); como cuando $foo ya es una matriz, no va a envolver de nuevo.


Referencia


produce los resultados deseados con escalares; los objetos producen diferentes resultados Los objetos lanzados a la matriz enumerarán las propiedades, por lo tanto, use la discreción.

Cuestiones relacionadas