mantener la variable constante de una función a otra

tengo una función

function createRandomString($length) {
    $string = md5(time());
    $highest_startpoint = 32-$length;
    # use hexdec to get a "number only" format
    $randomString = hexdec(substr($string,rand(0,$highest_startpoint),$length));
    return $randomString;
}
$randomID = createRandomString(7);

y quiero poder usar la cadena aleatoria creada en otras funciones

por ejemplo:

function new() {
echo '<input name="id" type="text" value="'.$randomID.'" disabled="disabled">';
}

Sin embargo, la identificación aleatoria no aparece en la nueva función (es decir, está en blanco).

Necesito definir la identificación aleatoria como una variable una vez para que el número permanezca constante a lo largo del script, ya que si lo definiera en cada función, obtendría un número diferente usando este método.

¿Hay alguna forma de definir la variable randomID utilizando el script en la parte superior y mantenerlo constante en todas las funciones que lo llaman?

preguntado el 30 de junio de 12 a las 18:06

¿No podría establecer una variable global de la función? -

¿Cómo se haría eso en el marco de este escenario? -

Coloque la variable en la clase fuera de todas las funciones. Preferiblemente justo después de la declaración de clase. (Donde definiría una variable TAG). -

ya probé eso. no parece funcionar -

No creo que "nuevo" sea un nombre legal para una función... -

3 Respuestas

Bueno, aunque lo desaconsejaría, la solución más fácil para lo que está tratando de hacer en el new la función es:

function new()
{
    global $randomID;
    echo '<input....'.$randomID.'/>';
}

Pero hay algunas formas más y mejores de lograr el mismo resultado:

usando clases:

class randomOutput
{
    protected static $_randomID;
    public function __construct()
    {
        self::$_randomID;//can be initialized here, using the same code you have in your createRandomId function
    }

   public function output()
   {
       echo '<input...'.self::$_randomID.'/>';
   }
}

usando argumentos, como muestra la respuesta de Zulkhaery Basrul. Puede hacer que el argumento sea opcional dando un valor predeterminado de null en la definición de su función.
Sin embargo, dado que esa respuesta ahora está eliminada:

function new($id)
{
    echo '<input...'.$id.'/>';
}

//with default val:
function new($id = null)
{
    $id = ($id === null ? createRandomId(7) : $id);
    echo '<input...'.$id.'/>';
}

$randId = createRandomId(7);
new($randId);
//some time later
new($randId);

Declarando constantes:

function createRandomString($length)
{
    if (defined(RANDOM_STRING_CONST))
    {
        return RANDOM_STRING_CONST;
    }
    //make your randomID, then:
    define('RANDOM_STRING_CONST',$randomID);
    return RANDOM_STRING_CONST;
}

Las clases también tienen constantes. Puede definirlos en una clase abstracta, de modo que todas las clases secundarias tengan acceso al mismo ID aleatorio. Como bono adicional (y peligro potencial), las constantes de clase definidas en el nivel principal pueden ser anuladas por la clase secundaria. ¡Así que ten cuidado!

Respondido el 30 de junio de 12 a las 18:06

También te estás perdiendo la forma más obvia: solo pasa $randomID como argumento - andresweber

Aquí ya había una respuesta que lo señalaba. Justo debajo de la clase rudimentaria, menciono la posibilidad de argumentos de función y también asignarles un valor predeterminado: P - Elias Van Ootegem

mmm. Por alguna razón, esa respuesta no estaba visible cuando publiqué mi comentario: andresweber

¿Algo de este código realmente se ejecuta? Estoy bastante seguro de que usar "nuevo" como nombre de función provoca errores fatales... - Marcos Eirich

@EliasVanOotegem Cierto. No confundas el OP. Supongo que una forma de evitar la confusión es cambiar el nombre a "_nuevo" y luego poner una nota en negrita en la parte superior de la respuesta para explicar qué/por qué... - Marcos Eirich

Una forma es usar una variable global. Ver http://php.net/manual/en/language.variables.scope.php

Sin embargo, el uso de variables globales se considera una mala práctica de programación. Es mejor organizar su código correctamente en clases y luego usar variables de clase e instancia.

Le recomiendo que lea un buen libro sobre PHP o sobre los principios de la programación orientada a objetos.

Respondido el 30 de junio de 12 a las 18:06

+1: Estoy de acuerdo, en este día una era (de OOP), usar globales es malo y muestra un mal diseño de clase (o falta de clases en conjunto). El mejor enfoque es tener una biblioteca de clases sólida y bien diseñada. Las constantes son una necesidad, en algunos casos, pero no para lo que describe el OP aquí. - Elias Van Ootegem

OOP es genial. Lo he estado haciendo desde que se inventó. Sin embargo, dado que una aplicación es una gran clase, ¿qué tiene de malo una variable global pertinente para toda la clase? No usar variables globales para algunas variables hace que cosas como onPause y onResume sean realmente engorrosas. Sólo me preguntaba... - Howard Hodson

Los globales tienen un lugar incluso en la programación moderna. Es bueno minimizar uso del espacio de nombres global, pero no se puede eliminar totalmente todo de él. Un buen programador conoce todas sus herramientas y sabe cuándo usarlas. Es por eso que sugerí que el OP leyera un poco :-) - Marcos Eirich

Por supuesto, los globales tienen su uso, pero no en este caso. Llamándolo malvado (un poco duro, lo admito), quería señalar que, tan pronto como escribes la palabra global, Que tienen preguntarse al menos 10 veces, "¿Es esta realmente la mejor manera". - Elias Van Ootegem

Jugando al "abogado del diablo", digo que existe una pequeña posibilidad de que el proyecto completo del OP tenga menos de 50 líneas y esté completamente contenido en un archivo PHP. Si eso fuera cierto, usar globales solo sería un pequeño pecado. :-PAGS - Marcos Eirich

<?php
function createRandomString($length) {
    $string = md5(time());
    $highest_startpoint = 32-$length;
    # use hexdec to get a "number only" format
    $randomString = hexdec(substr($string,rand(0,$highest_startpoint),$length));
    return $randomString;
}
$randomID = createRandomString(7);


function newfunction($arg) {
echo '<input name="id" type="text" value="'.$arg.'" disabled="disabled">';
}

newfunction($randomID);
?>

Respondido el 30 de junio de 12 a las 18:06

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.