Double not (!!) operator in PHP
It's not the "double not operator", it's the not operator applied twice. The right !
will result in a boolean, regardless of the operand. Then the left !
will negate that boolean.
This means that for any true value (numbers other than zero, non-empty strings and arrays, etc.) you will get the boolean value TRUE
, and for any false value (0, 0.0, NULL
, empty strings or empty arrays) you will get the boolean value FALSE
.
It is functionally equivalent to a cast to boolean
:
return (bool)$row;
What does double question mark (??) operator mean in PHP
It's the "null coalescing operator", added in php 7.0. The definition of how it works is:
It returns its first operand if it exists and is not NULL; otherwise it returns its second operand.
So it's actually just isset()
in a handy operator.
Those two are equivalent1:
$foo = $bar ?? 'something';
$foo = isset($bar) ? $bar : 'something';
Documentation: http://php.net/manual/en/language.operators.comparison.php#language.operators.comparison.coalesce
In the list of new PHP7 features: http://php.net/manual/en/migration70.new-features.php#migration70.new-features.null-coalesce-op
And original RFC https://wiki.php.net/rfc/isset_ternary
EDIT: As this answer gets a lot of views, little clarification:
1There is a difference: In case of ??
, the first expression is evaluated only once, as opposed to ? :
, where the expression is first evaluated in the condition section, then the second time in the "answer" section.
What is the !! (not not) operator in JavaScript?
It converts Object
to boolean
. If it was falsey (e.g., 0
, null
, undefined
, etc.), it would be false
, otherwise, true
.
!object // Inverted Boolean
!!object // Noninverted Boolean, so true Boolean representation
So !!
is not an operator; it's just the !
operator twice.
It may be simpler to do:
Boolean(object) // Boolean
Real World Example "Test IE version":
const isIE8 = !! navigator.userAgent.match(/MSIE 8.0/);
console.log(isIE8); // Returns true or false
If you ⇒
console.log(navigator.userAgent.match(/MSIE 8.0/));
// Returns either an Array or null
But if you ⇒
console.log(!!navigator.userAgent.match(/MSIE 8.0/));
// Returns either true or false
What is the effect of a double negating bitwise operator (~~) - also called double tilde - in PHP?
It should be !!
(it converts the value to a boolean) but it is not needed at all. I guess the original coder mistaken ~
for !
then they added (bool)
in front of it to achieve the desired result (because, as you noticed in the question, ~~
is a no-op).
The ternary operator (?:
) forces the evaluation of its first argument as boolean.
The boolean value of $field->req
is the same as of !! $field->req
and (bool) ~~$field->req
(and (bool)$field->req
btw).
I would remove the (bool) ~~
part completely to get smaller and cleaner code.
Edit by questioner: The only effect of ~~ in PHP is to cut of decimals from a float value.
See the following results:
$a = 2.123;
$b = -2.123;
$c = new stdClass();
$d = ["a",2,"c"];
$e = "lord";
$f = -3;
$g = false;
$h = null;
$j = -2.99;
$k = 2.99;
var_dump(~~$a);
var_dump(~~$b);
// var_dump(~~$c); // error
// var_dump(~~$d); // error
var_dump(~~$e);
var_dump(~~$f);
// var_dump(~~$g); // error
// var_dump(~~$h); // error
var_dump(~~$j);
var_dump(~~$k);
var_dump(!!$a);
var_dump(!!$b);
var_dump(!!$c);
var_dump(!!$d);
var_dump(!!$e);
var_dump(!!$f);
var_dump(!!$g);
var_dump(!!$h);
var_dump(!!$j);
var_dump(!!$k);
int(2) int(-2) string(4) "lord" int(-3) int(-2) int(2)
bool(true) bool(true) bool(true) bool(true) bool(true) bool(true)
bool(false) bool(false) bool(true) bool(true)
PHP Two Exclaimation Mark !! Operator with preg_match?
preg_match returns 0 or 1 (or false on error) and this intStr function is meant to return a boolean value. A single !$x
first converts $x
to boolean, then negates. !!$x
just reverts this negation, so it is a shorter way to write (bool)$x
.
However, this saving of four characters results in loss of readability (and two unneccessary operations, but that's negligible), so it's not recommended.
It's clever code, but there is a rule in programming: Don't be clever
When to use the double not (!!) operator in JavaScript
In the context of if
statements I'm with you, it is completely safe because internally, the ToBoolean
operation will be executed on the condition expression (see Step 3 on the spec).
But if you want to, lets say, return a boolean value from a function, you should ensure that the result will be actually boolean, for example:
function isFoo () {
return 0 && true;
}
console.log(isFoo()); // will show zero
typeof isFoo() == "number";
In conclusion, the Boolean Logical Operators can return an operand, and not a Boolean
result necessarily:
The Logical AND operator (&&
), will return the value of the second operand if the first is truly:
true && "foo"; // "foo"
And it will return the value of the first operand if it is by itself falsy:
NaN && "anything"; // NaN
0 && "anything"; // 0
On the other hand, the Logical OR operator (||
) will return the value of the second operand, if the first one is falsy:
false || "bar"; // "bar"
And it will return the value of the first operand if it is by itself non-falsy:
"foo" || "anything"; // "foo"
Maybe it's worth mentioning that the falsy values are: null
, undefined
, NaN
, 0
, zero-length string, and of course false
.
Anything else (that is not falsy, a Boolean
object or a Boolean
value), evaluated in boolean context, will return true
.
What do the double-less-than and pipe operators do?
Those are Bitwise operators that allow evaluation and manipulation of specific bits within an integer.
$a | $b Or Bits that are set in either $a or $b are set.
$a << $b Shift left Shift the bits of $a $b steps to the left (each step means "multiply by two")
$a >> $b Shift right Shift the bits of $a $b steps to the right (each step means "divide by two")
Not equal to != and !== in PHP
==
and !=
do not take into account the data type of the variables you compare. So these would all return true:
'0' == 0
false == 0
NULL == false
===
and !==
do take into account the data type. That means comparing a string to a boolean will never be true because they're of different types for example. These will all return false:
'0' === 0
false === 0
NULL === false
You should compare data types for functions that return values that could possibly be of ambiguous truthy/falsy value. A well-known example is strpos()
:
// This returns 0 because F exists as the first character, but as my above example,
// 0 could mean false, so using == or != would return an incorrect result
var_dump(strpos('Foo', 'F') != false); // bool(false)
var_dump(strpos('Foo', 'F') !== false); // bool(true), it exists so false isn't returned
PHP: Multiple conditions with NOT Equal (!=) operator is not working
Better code:
$allowed = array('jpeg','png');
if(in_array($ext,$allowed)){
echo "Correct";
}
else {
echo "Wrong";
}
Related Topics
Pass Arraylist Bean from Android to Webservice PHP
Getting the First Character of a String with $Str[0]
How to Solve Time Out in PHPmyadmin
How to Convert Seconds to Time Format
Publishing to User's Wall Without Being Online/Logged-In - Facebook Sharing Using Graph API
How to Use PHP Array with SQL in Operator
Flatten Multidimensional Array Concatenating Keys
How to Encrypt PHP Source or Compile It So Others Can't See It? and How
How to Separate Letters and Digits from a String in PHP
Decode a Quoted Printable Message in PHP
How to Specify Composer Install Path
When Should I Use Stdclass and When Should I Use an Array in PHP Oo Code
Get Current Url Path with Query String in PHP