Pregunta

Tengo una pregunta interesante acerca de la forma en PHP evalúa las expresiones booleanas. Cuando se tiene, por ejemplo,

$expression = $expression1 and $expression2;

o

if ($expression1 and $expression2)

PHP comprueba primero si $expression1 evalúa a true . Si este no es el caso, entonces $expression2 simplemente se omite para evitar cálculos innecesarios. En un guión que estoy escribiendo, tengo:

if ($validator->valid("title") and $validator->valid("text"))

Es necesario disponer de la segunda declaración ($validator->valid("text")) evaluado incluso si el primero se evalúa como falsa. Me gustaría preguntarle si hay alguna manera fácil de forzar PHP para evaluar siempre las dos declaraciones. Gracias!

¿Fue útil?

Solución

Esto se conoce como corto circuito de evaluación , y para evitar que lo que necesita hacer esto, utilizando un único &:

if($validator->valid("title") & $validator->valid("text")) {

}

Tenga en cuenta que esto no está usando operadores lógicos pero en realidad operadores bit a bit :

  

Son los operadores que actúan sobre las representaciones binarias de los números. No toman valores lógicos (es decir, "verdadero" o "falso") como argumentos sin primero convertirlos a los números 1 y 0 respectivamente. Tampoco se devuelven valores lógicos, pero los números. Sin duda, puede más adelante tratar esos números como si fueran valores lógicos (en cuyo caso 0 se convierte al "falso" y todo lo demás se echaron a "true"), pero eso es una consecuencia de las reglas de conversión de tipos de PHP, y nada que ver con el comportamiento de los operadores.

Como tal, no es algunos debate en cuanto a si se trata de una buena práctica utilizar este efecto secundario de eludir la evaluación de cortocircuito. Yo, personalmente, al menos poner un comentario que el Y es intencional, pero si quieres ser lo más pura posible se debe evaluar si son válidos primero y luego hacer el caso.

Otros consejos

$isValidTitle = $validator->valid("title");
$isValidText = $validator->valid("text");
if($isValidTitle && $isValidText)
{
    ...
}

Will ese traje?

tratar de evaluar cada término por separado:

$term1 = $validator->valid("title");
$term2 = $validator->valid("text");
if($term1 && $term2) {
//things to do
}

Esto podría no ser la mejor aplicación, pero siempre se podía hacer:

$a=$validator->valid("title");
$b=$validator->valid("text");
if($a && $b) {...}

Se puede definir una función como:

function logical_and($x,$y) {return ($x && $y);}

A partir de PHP utiliza llamada por valor, esto funciona.

Por otra parte, si se puede modificar la clase $ validador instancia, podría hacer que el método válido aceptar una cadena o una matriz. Si se trata de una matriz, se ejecuta el código que ya existe en cada artículo y sólo devuelve VERDADERO si todos los elementos son "válidos".

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top