[Pregunta]: ¿Cómo hago para saber si un parámetro viene de una variable o una constante?

Iniciado por Leguim, 7 Noviembre 2021, 00:23 AM

0 Miembros y 1 Visitante están viendo este tema.

Leguim

Es decir:
Código (php) [Seleccionar]

function F($dato)
{
      if($dato viene de una variable)
      {
             echo 'el parámetro viene de una variable';
      }
      else
      {
            echo 'el parámetro viene de una constante';
      }
}


Ejecuciones:
Código (php) [Seleccionar]

F(700); // el parámetro viene de una constante

$variable = 700;
F($variable); // el parámetro viene de una variable


¿Cómo harían esto?

#!drvy

No tiene mucho sentido. En el momento en el que lo pasas a una función, el parámetro se vuelve una variable.


Ni siquiera debug_backtrace() te dice como se ha pasado el valor. Puedes forzar a que te pasen solo variables requiriendo los parámetros por referencia:

Código (php) [Seleccionar]
function  F (&$dato) {}

Esto tiraría un fatal error si se le pasa una constante, pero también tienes el problema de que ahora la variable está referenciada y cualquier cambio afecta a nivel global.

También puedes buscar si el valor está definido en las $GLOBALS por tanto ahí sabrías que tienes una variable con ese valor... pero ni es fiable ni recomendable.


¿Por qué quieres saber de donde viene?

Saludos

Danielㅤ

Hola, una manera que se me ocurre tomando tu código de ejemplo, sería la siguiente:

Código (php) [Seleccionar]


$variable = NULL;
F(700);
$variable = 700;
F($variable);

function F($dato)
{
    if(!is_null($dato))
    {
        echo 'el parametro viene de una variable';
        $variable = NULL;
    }
    else
    {
        echo 'el parametro viene de una constante';
    }
}



Saludos
¡Regresando como cual Fenix! ~
Bomber Code © 2021 https://www.bombercode.net/foro/

Ayudas - Aportes - Tutoriales - Y mucho mas!!!

Serapis

La definición de una función no contempla constantes.
El usuario cuando no quiere que el contenido de un dato sea modificado dentro de la función, es reponsable de mandar una copia, lo que técnicamente es lo mismo que una constante, pero de forma transparente a la función. Porque dentro de la función no se sabe el origen de la misma.

De hecho uno podría hacer todas estas cosas:

entero = declaracion de funcion Y(entero valor)
   valor +=2
   devolver valor modulo 5
fin funcion

...
...
...

constante de entero x = 25
entero z

z= funcion Y(25)   // técnicamente se está recibiendo una constante inicializada durante la llamada.
...
fin funcion

z= x
z = funcion Y(z)  // es una constante si se pasa como valor, aunque al final el retorno se le entrega a 'z' y acaba así cambiando de valor.
...
fin funcion

z= 25
z= funcion Y(z +0)  //técnicamente se está recibiendo una constante, resultante de la suma de z + un valor constante... que se guardará en la pila, y que en origen tampoco se podrá rescatar.
...
fin funcion

z= funcion Y(x +3)  // igual que anterior, aunque es la suma de dos constantes.
...
fin funcion

z= 7
z= funcion Y(x + z + 3)   // igual que anterior... cuando procede de una expresión es lo mismo que si fuera una constante.
...
fin funcion


Como puedes entender, indistintamente de que se pase en ocasiones por valor o por referencia, una constante, no es meramente aquello que está declarado como constante, puede asumirse que es constante, si el cambio de dicha variable dentro de la función, a la vuelta de la función no afecta a la de origen. Una función no necesita saber que pasa fuera de ella, solo precisa saber que se hace dentro, para eso tiene el código preciso de lo que debe hacer. Si resultara vital saber si una variable es o no una constante (no se me ocurre a bote pronto, ningún caso donde esto deba ser necesario, ni siquiera útil), podría añadirse un parámetro adicional que así lo detalle, pero no hay garantias  de que el usuario tenga que 'decir' la verdad...

MinusFour

Cita de: Danielㅤ en  7 Noviembre 2021, 15:53 PM
Hola, una manera que se me ocurre tomando tu código de ejemplo, sería la siguiente:

Código (php) [Seleccionar]


$variable = NULL;
F(700);
$variable = 700;
F($variable);

function F($dato)
{
    if(!is_null($dato))
    {
        echo 'el parametro viene de una variable';
        $variable = NULL;
    }
    else
    {
        echo 'el parametro viene de una constante';
    }
}



Saludos

Este código no funciona.

Dudo mucho que haya una situación en la que importe si el argumento es una literal o una variable. Al menos no en PHP.

Danielㅤ

Si es posible que no funcione porque no estoy desde una PC para probarlo o un hosting y los intérpretes online son un tanto pesados desde un móvil y además algunas veces funcionan de una manera inesperada.

Pero básicamente el código de ejemplo que he dejado es una posible forma que se lo podría hacer.


Saludos
¡Regresando como cual Fenix! ~
Bomber Code © 2021 https://www.bombercode.net/foro/

Ayudas - Aportes - Tutoriales - Y mucho mas!!!

MinusFour

Cita de: Danielㅤ en  7 Noviembre 2021, 19:06 PM
Si es posible que no funcione porque no estoy desde una PC para probarlo o un hosting y los intérpretes online son un tanto pesados desde un móvil y además algunas veces funcionan de una manera inesperada.

Pero básicamente el código de ejemplo que he dejado es una posible forma que se lo podría hacer.


Saludos

Yo creo que a final de cuentas tu ejemplo es una manera manual para confirmar si es una variable o literal.

E.g.

Código (php) [Seleccionar]

function test($valor, $estasUsandoVariable){
   if($estasUsandoVariable) {
     echo 'El valor es una variable';
   } else {
     echo 'El valor es una literal';
   }
}

$variable = 700;
test(700, false);
test($variable, true);


Lo cual no contesta la pregunta realmente...

elmascato

Tú siempre vas a recibir una variable en la función, ya que tiene que ser un dato dinámico. Dentro de la misma función es donde deberías definir el tipo en el que quieres incorporar esos datos, en una variable o en una constante