Foros del Web » Programando para Internet » PHP »

[duda existencial] si tengo if($a && $b)... y $a es falso, ¿Se evalúa $b?

Estas en el tema de [duda existencial] si tengo if($a && $b)... y $a es falso, ¿Se evalúa $b? en el foro de PHP en Foros del Web. Hola, tengo esta molesta duda, resulta que me estoy obsesionando hacer un script lo más eficiente posible y no sé que me conviene hacer en ...
  #1 (permalink)  
Antiguo 10/10/2010, 19:01
 
Fecha de Ingreso: diciembre-2009
Ubicación: dirname(__FILE__)
Mensajes: 149
Antigüedad: 15 años
Puntos: 11
Pregunta [duda existencial] si tengo if($a && $b)... y $a es falso, ¿Se evalúa $b?

Hola, tengo esta molesta duda, resulta que me estoy obsesionando hacer un script lo más eficiente posible y no sé que me conviene hacer en el siguiente caso:

Conciso:
Se tiene $a y $b, variables booleanas. Si $a es falso, ¿se evalúa $b en..?
Código PHP:
if( $a && $b ) {
#hacer algo

Detalloso:
Necesito saberlo porque estoy creando una clase que me administre la conexión con la base de datos y tengo cosas como éste estilo:
Código PHP:
...
} elseif(
is_null($this->respuesta) && !$this->ejecutar_instrucciones()) {
                return 
false;

En éste caso, si la variable respuesta (el recurso que devuelve la base de datos) es nulo && lo otro es falso (no se pudo ejecutar la instrucción) retorno falso. No quiero que lo segundo se ejecute si lo primero es falso, porque supondría un gasto innecesario de recursos del sistema.

Saludos y Gracias!
  #2 (permalink)  
Antiguo 10/10/2010, 19:08
Avatar de dreamconception  
Fecha de Ingreso: octubre-2010
Ubicación: Mexico-Dinamarca
Mensajes: 22
Antigüedad: 14 años, 2 meses
Puntos: 2
Respuesta: [duda existencial] si tengo if($a && $b)... y $a es falso, ¿Se evalúa $b?

No $b es no evalúa si $a es falso.
  #3 (permalink)  
Antiguo 10/10/2010, 19:09
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 15 años, 6 meses
Puntos: 1517
Respuesta: [duda existencial] si tengo if($a && $b)... y $a es falso, ¿Se evalúa $b?

La mejor forma es indicando que debe tener la variable para que ejecute el código que tengas en la condición. Por ejemplo usando isset, empty, is_null, etc. etc.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #4 (permalink)  
Antiguo 10/10/2010, 19:11
Avatar de dreamconception  
Fecha de Ingreso: octubre-2010
Ubicación: Mexico-Dinamarca
Mensajes: 22
Antigüedad: 14 años, 2 meses
Puntos: 2
Respuesta: [duda existencial] si tengo if($a && $b)... y $a es falso, ¿Se evalúa $b?

Addendum;

No $b es no evalúa si $a es falso. Es así como la lógica de programación está construido.

Si tu quieres examinar esto, ejecutar un echo/error_log in ejecutar_instrucciones.
  #5 (permalink)  
Antiguo 10/10/2010, 19:27
 
Fecha de Ingreso: diciembre-2009
Ubicación: dirname(__FILE__)
Mensajes: 149
Antigüedad: 15 años
Puntos: 11
Respuesta: [duda existencial] si tengo if($a && $b)... y $a es falso, ¿Se evalúa $b?

Gracias a ambos, pero me inclino a que pasa lo que dice dreamconception.

Es que si uso is_null empty lo demases estaría igualmente haciendo un gasto innecesario de recursos.
  #6 (permalink)  
Antiguo 10/10/2010, 20:09
Avatar de Sourcegeek
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: $mex['B.C.'];
Mensajes: 1.816
Antigüedad: 15 años, 7 meses
Puntos: 322
Respuesta: [duda existencial] si tengo if($a && $b)... y $a es falso, ¿Se evalúa $b?

Mira, te explico lo siguiente;
Código PHP:
if ($a && $b) {
echo 
'si existen';

Ahi, por logica, se checa primero $a...
Si $a no existe, ya no continua con el codigo y pasa a lo que seria
el else, o si existe un elseif..
Si existiese $a, por logica checaria ahora $b, si ambos existen haria
lo que esta entre corchetes, pero si $a existe pero $b no, pasaria
a else o elseif..

Ahora, si usaras el operador OR...
Código PHP:
if ($a or $b) {
echo 
'si existe';

Ahi, exista o no exista $a, checaria tambien $b...
Si alguno de los dos (o los dos) existen, pasaria a lo que esta
entre corchetes..
Si no existe ninguno, pasaria al else o elseif..
__________________
Buscas desarrollador web? Sourcegeek. Diseño web, Maquetación y Programación
¡Escribe bien! Esto es un foro, no un Facebook para que escribas con los pies
  #7 (permalink)  
Antiguo 10/10/2010, 20:27
 
Fecha de Ingreso: diciembre-2009
Ubicación: dirname(__FILE__)
Mensajes: 149
Antigüedad: 15 años
Puntos: 11
Respuesta: [duda existencial] si tengo if($a && $b)... y $a es falso, ¿Se evalúa $b?

Gracias Sourcegeek, confirmas lo que responde dreamconception. Realmente es un alivio que funcione así, porque de otro modo tendría que hacer cosas como estas
Código PHP:
Ver original
  1. if( $a ) {
  2.   if( $b ) {
  3.     #algo
  4.  }
  5. }

Ahora sé que no es necesario y con ésto basta
Código PHP:
Ver original
  1. if($a && $b) {  /*algo*/ }

Saludos.
  #8 (permalink)  
Antiguo 10/10/2010, 20:33
Avatar de Sourcegeek
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: $mex['B.C.'];
Mensajes: 1.816
Antigüedad: 15 años, 7 meses
Puntos: 322
Respuesta: [duda existencial] si tengo if($a && $b)... y $a es falso, ¿Se evalúa $b?

Exacto, me alegro que haya ayudado :)

Recuerda siempre los operadores;
'and' es para proceder SOLO si todos los valores son como tu le indicas
'or' para proceder SOLO si uno o mas de los valores es como tu indicas

Y;
'and' = '&&'
'or' = '||'
Es decir, es lo mismo poner AND como poner &&.. O poner OR como poner ||
Y tambien recuerda que puedes poner tantos valores quieras;
Código PHP:
if ($a=='eje' && $b && $c=='eje2') {
echo 
'ejemplo';
}

//O tambien podrias hacer...
if ($a=='eje' || $b || $c=='eje2') {
echo 
'ejemplo2';

__________________
Buscas desarrollador web? Sourcegeek. Diseño web, Maquetación y Programación
¡Escribe bien! Esto es un foro, no un Facebook para que escribas con los pies
  #9 (permalink)  
Antiguo 10/10/2010, 21:52
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 15 años, 6 meses
Puntos: 1517
Respuesta: [duda existencial] si tengo if($a && $b)... y $a es falso, ¿Se evalúa $b?

Vas a tener errores en un futuro en el código si no usas las funciones que se crearon para verificar si tienes o existe la variable valor. Vamos a suponer que anteriormente no se declaro la variable $a cuando la vayas a usar en la condición te va a dar una notificación. Es buena costumbre programar para que no tenga ningún error. Por lo tanto es necesario y no un gasto de recurso usar empty, isset, is_null, etc. Te recomiendo que pases por el área de aportes para que entiendas como activar el error_reporting a que reconozca todos los errores y así programes adecuadamente para que funcione en todos los ambitos.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #10 (permalink)  
Antiguo 10/10/2010, 22:07
Avatar de oso96_2000  
Fecha de Ingreso: junio-2002
Ubicación: Distrito Federal
Mensajes: 558
Antigüedad: 22 años, 6 meses
Puntos: 35
Respuesta: [duda existencial] si tengo if($a && $b)... y $a es falso, ¿Se evalúa $b?

Recordaba haber hablado de eso hace ya un tiempo, y que me había parecido bastante interesante, así que aquí les dejo la url del tema: http://www.forosdelweb.com/f18/compr...tencia-646324/
__________________
Sin Ideas
  #11 (permalink)  
Antiguo 10/10/2010, 22:46
 
Fecha de Ingreso: diciembre-2009
Ubicación: dirname(__FILE__)
Mensajes: 149
Antigüedad: 15 años
Puntos: 11
Respuesta: [duda existencial] si tengo if($a && $b)... y $a es falso, ¿Se evalúa $b?

abimaelrc: Ahora entendí lo que decías, en el trozo de código que puse:
Código PHP:
Ver original
  1. ...
  2. } elseif(is_null($this->respuesta) && !$this->ejecutar_instrucciones()) {
  3.                 return false;
  4. }

uso "is_null" en la variable respuesta, porque es un atributo de la clase que no se crea con el contructor, por tanto si está en null mi función debería retornar false. Lo otro "ejecutar_instrucciones()" lo que hace es ejecutar la sentencia mysql por ejemplo "SELECT * FROM tabla", entonces haría (si fuera mysql), "mysql_query("SELECT * FROM tabla"). Por dar un ejemplo.

Construí esa función de tal forma de que si hay un error me arroje false, por eso uso un ! (signo exclamación) antes de esa función.

Los empty, isset los uso cuando tengo que validar formularios. No creo que se deba (o pueda) usar is_null($this->ejecutar_instrucciones()), porque yo mismo cree la función y sé que nunca arrojará null (y como no es una variable propiamente tal, no puedo usar isset o !empty).

(si sigo sin entender porfa, avísame ).

oso96_2000: Gracias, gracias!, el tema esta buenísimo. Ahora sé que AND no es lo mismo que && y que OR no es lo mismo que ||.
  #12 (permalink)  
Antiguo 10/10/2010, 22:57
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 15 años, 6 meses
Puntos: 1517
Respuesta: [duda existencial] si tengo if($a && $b)... y $a es falso, ¿Se evalúa $b?

Puedes ingresar la función en una variable y luego llamar empty, ejemplo
Código PHP:
Ver original
  1. <?php
  2. function foo(){
  3.     return null;
  4. }
  5. if(is_null(foo())){
  6.     echo 'foo is null <br />';
  7. }
  8.  
  9. $foo = foo();
  10. if(empty($foo)){
  11.     echo 'foo se considera también empty <br />';
  12. }
Y además tanto como && como AND y || como OR son iguales, la única diferencia es su precedencia. Pero se resuelve usando parentesis, si es que sea necesario.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #13 (permalink)  
Antiguo 10/10/2010, 23:11
 
Fecha de Ingreso: diciembre-2009
Ubicación: dirname(__FILE__)
Mensajes: 149
Antigüedad: 15 años
Puntos: 11
Respuesta: [duda existencial] si tengo if($a && $b)... y $a es falso, ¿Se evalúa $b?

Cita:
Iniciado por abimaelrc Ver Mensaje
Puedes ingresar la función en una variable y luego llamar empty, ejemplo
Código PHP:
Ver original
  1. <?php
  2. function foo(){
  3.     return null;
  4. }
  5. if(is_null(foo())){
  6.     echo 'foo is null <br />';
  7. }
  8.  
  9. $foo = foo();
  10. if(empty($foo)){
  11.     echo 'foo se considera también empty <br />';
  12. }
Entiendo, pero en mi caso particular parece que eso se vuelve inviable... mira, copio mi función ek_objetos($instrucciones = null), que está dentro de mi clase BaseDatos.



Código PHP:
Ver original
  1. /**
  2.      * Éste método retorna una consulta a la base de datos como un arreglo de
  3.      * objetos. Cada posición del arreglo viene de una fila en la
  4.      * tabla de la base de datos, esto representado en forma de objeto. Cada
  5.      * parámetro de ése objeto viene de una columna de la tabla.
  6.      *
  7.      * ejemplo de uso:
  8.      * $resultado = array();
  9.      * $resultado = $bd->ek_objetos("SELEC * FROM usuarios");
  10.      * echo $resultado[0]->nombre;
  11.      * echo $resultado[0]->edad;
  12.      * etc.
  13.      *
  14.      * @return <object[]> un arreglo de objetos, producto de preguntar a la
  15.      * base de datos, o false en caso de error.
  16.      */
  17.     public function ek_objetos($instrucciones = null) {
  18.  
  19.         // Si es que no se le pasan parámetros (instrucciones a ejecutar en la
  20.         // base de datos), se hace lo sigueinte:
  21.         if (is_null($instrucciones)) {
  22.  
  23.             // En caso de que exista una respuesta previa, se retorna.
  24.             if (!is_null($this->respuesta)) {
  25.                 return $this->respuesta;
  26.  
  27.                 // Caso contrario se ejecutan las instrucciones que están
  28.                 // registradas. En caso de que haya un error (como que no existan
  29.                 // tales instrucciones), se retorna falso.
  30.             } elseif (!$this->agar_instrucciones()) {
  31.                 return false;
  32.             }
  33.  
  34.             // En el caso de que sí se hayan pasado parámetros:
  35.         } else {
  36.  
  37.             // Se registran.
  38.             $this->en_instrucciones($instrucciones);
  39.             // Y se ejecutan (para registrar respuesta). En caso de que exista
  40.             // error, se retorna falso.
  41.             if (!$this->agar_instrucciones()) {
  42.                 return false;
  43.             }
  44.         }
  45.  
  46.         // Variable desde la cual se retornará el arreglo de objetos.
  47.         $objetos = array();
  48.  
  49.         // Ciclo que en cada vuelta extrae una fila de la base de datos y la
  50.         // transforma en un objeto para luego asignarlo al arreglo $objetos.
  51.         while ($fila = mysql_fetch_object($this->respuesta)) {
  52.             $objetos[] = $fila;
  53.         }
  54.  
  55.         // retornar el arreglo de objetos.
  56.         return $objetos;
  57.     }

El método agar_instrucciones() era el ejecutar_instrucciones() (es lo mismo). Este método es el encargado de hacer la consulta mysql, por lo que lo trato de evitar lo más posible. En ese caso si es que hiciera is_null($this->agar_instrucciones()) significaría que tendría que evauarlo, aún cuando es innecesario.

Etiquetas: existencial
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 02:15.