How do string comparison operators work in Twig?

Scottymeuk picture Scottymeuk · Apr 24, 2013 · Viewed 78.5k times · Source

How is this possible? It seems to be a very very odd issue (unless I’m missing something very simple):

Code:

{{ dump(nav) }}
{% if nav == "top" %}
    <div class="well">This would be the nav</div>
{% endif %}

Output:

boolean true
<div class="well">This would be the nav</div>

Screenshot

Basically, it is outputting if true, but it’s not meant to be checking for true.

Answer

Alain Tiemblo picture Alain Tiemblo · Apr 24, 2013

This is easily reproductible :

{% set nav = true %}
{% if nav == "top" %}
ok
{% endif %}

Displays ok.

According to the documentation :

Twig allows expressions everywhere. These work very similar to regular PHP and even if you're not working with PHP you should feel comfortable with it.

And if you test in pure PHP the following expression :

$var = true;
if ($var == "top") {
  echo 'ok';
}

It will also display ok.

The point is : you should not compare variables of different types. Here, you compare a bool with a string : if your string is not empty or if it does not contains only zeros, it will evaluate to true.

You can also have a look to the PHP manual to see how comparison are made with different types.

Edit

You can use the sameas test to make strict comparisions, and avoid type juggling matters.