W3docs

What is the difference between the | and || or operators?

In PHP, the "|" and "||" operators are both bitwise and logical operators.

In PHP, the | and || operators serve different purposes: | is a bitwise OR operator, while || is a logical OR operator.

The difference between these two operators lies in how they evaluate operands and handle types. The bitwise OR operator | compares each bit of the first operand to the corresponding bit of the second operand and returns a result where each bit is set to 1 if either corresponding bit is 1. It always evaluates both operands and converts non-integer values to integers before operating.

The logical OR operator || evaluates the operands as booleans and returns true if at least one operand is true, or false if both are false. Crucially, || uses short-circuit evaluation: if the left operand is truthy, the right operand is not evaluated at all.

Here is an example to illustrate the difference between these two operators:

Example of the difference between the | and || or operators in PHP

php— editable, runs on the server

In this example, the variable $a is assigned the decimal value 4, which has a binary equivalent of 100. The variable $b is assigned the decimal value 5, which has a binary equivalent of 101.

The variable $c is then assigned the result of performing a bitwise OR operation on $a and $b, which results in the binary value 101 (decimal 5). The binary representation of $c is also shown using the decbin() function.

The variable $d is then assigned the result of performing a logical OR operation on $a and $b, which results in the boolean value true. The boolean value of $d is output using a ternary operator to display either "true" or "false".

When this code is run, the output will be:


a = 4 (binary 100)
b = 5 (binary 101)
a | b = 5 (binary 101)
a || b = true

This output shows the original values of $a and $b in both decimal and binary format, the result of the bitwise OR operation on $a and $b (also in both decimal and binary format), and the result of the logical OR operation on $a and $b. Note that || coerces operands to booleans and short-circuits evaluation, whereas | always evaluates both sides and operates directly on integer bit patterns.