Q:

How does empty() separation works? 

I have these if statements with empty() function with vars $a, $b, $c
if (empty($a .  $b .  $c)) {echo 'empty.dot';}

if (empty($a && $b && $c)) {echo 'empty';}

if (! empty($a .  $b .  $c)) {echo 'filled.dot';}

if (! empty($a && $b && $c)) {echo 'filled';}

I got a weird result testing them like the following:
case[1]:
$a = '1';
$b = '1';
$c = '1';
result:
fillted.dot, filled

case[2]:
$a = '1';
$b = '';
$c = '1';
result:
empty, fillted.dot

case[3]:
$a = '';
$b = '';
$c = '';
result:
empty.dot, empty

What i don't understand is 
Why in case[2] i got both empty($a && $b && $c) and ! empty($a .  $b .  $c) = TRUE 

A:

empty does not care about stuffing expressions in it.  To make the behaviour more obvious, don't do that either.  Split up your expressions into what they actually do:
$and = $a && $b && $c;
$cat = $a .  $b .  $c;

var_dump( empty($and) );
var_dump( empty($cat) );

And it's rather clear why 

(1 && "" && 1) is FALSE, and thus empty(FALSE) is TRUE
! empty("11") returns TRUE.