PHP Ternary operator clarification - php

I use the ternary operator quite often but I've not been able to find anything in the documentation about this and I've always wondered it.
The following is a possible example:
echo ($something->message ? $something->message : 'no message');
as you can see, if $something->message is correct, we return $something->message, but why write it twice? Is there a way to do something like:
echo ($something->message ? this : 'no message');
Now I'm not well versed in programming theory, so it's possible that there is a reason that the former cannot be referenced with something like "this" but why not? Would this not stream line the use of the ternary operator? For something like my example it's pretty useless, but let's say it's
echo (function(another_function($variable)) ? function(another_function($variable)) : 'false');
I'm unable to find any way to do this, so I'm assuming it's not possible, if I'm wrong please inform me, otherwise: why not? Why is this not possible, what's the technical reason, or is it just something that never happened? Should I be declaring it as a variable and then testing against that variable?

Since PHP 5.3, it is possible to leave out the middle part of the ternary operator. Expression expr1 ?: expr3 returns expr1 if expr1 evaluates to TRUE, and expr3 otherwise.
Source
For example
$used_value = function1() ?: $default_value;
Is the same as
$check_value = function1(); //doesn't re-evaluate function1()
if( $check_value ) {
$used_value = $check_value;
} else {
$used_value = $default_value;
}
Word for the wise
If your going to be depending on typecasting to TRUE it's important to understand what WILL typecast to TRUE and what won't. It's probably worth brushing up on PHP's type juggling and reading the type conversion tables. For example (bool)array() is FALSE.

Related

PHP short statement to make variable fallback to default [duplicate]

This question already has answers here:
Coalesce function for PHP?
(10 answers)
Closed 7 years ago.
As we know, if we are using javascript or python, we can use the below statement to get a variable, or its default.
// javascript
alert(a || 'default');
# python
print(a or 'default');
While in php, we may have to call the below:
echo $a ? $a : 'default';
And if the $a is a very long statement, the case is even worse:
echo (
we_made_many_calculation_here_and_this_is_the_result() ?
we_made_many_calculation_here_and_this_is_the_result() :
'default'
);
or
var $result = we_made_many_calculation_here_and_this_is_the_result();
echo $result ? $result : 'default';
any of the above, I think it is not neat.
And I'm blind to find any answer, to find a statement or built-in function to simplifies the work. But after trying to search many ways, I can't find the answer.
So please help.
Relating to this issue: http://php.net/manual/en/language.operators.logical.php#115208
So, see the documentation of the ternary operator, it is possible to use:
echo $a ?: 'defaults for a';
The expression (expr1) ? (expr2) : (expr3) evaluates to expr2 if expr1 evaluates to TRUE, and expr3 if expr1 evaluates to FALSE.
Since PHP 5.3, it is possible to leave out the middle part of the ternary operator. Expression expr1 ?: expr3 returns expr1 if expr1 evaluates to TRUE, and expr3 otherwise.
See: http://www.php.net/manual/en/language.operators.comparison.php#language.operators.comparison.ternary
Doing $a when $a is undefined will still give you an error. Unfortunately, the only proper way to do it when handling a variable is:
echo isset($a) ? $a: 'default';
When handling the long function, you still need to check for the conditions that you want to check, because if it returned false, you will still fall into default.
var $result = we_made_many_calculation_here_and_this_is_the_result(); // false
echo $result ? $result : 'default'; // echos default
You need:
var $result = we_made_many_calculation_here_and_this_is_the_result();
echo !is_null($result) ? $result : 'default';
This is a sad limitation in what php interprets as false. You can see a full list here.
Why not try doing it the other way round, and start off by setting the variable to its default value?
$a = "default";
...
echo $a;
Then you don't need to check if it's set or not - just use the variable.
This has the added bonus of it then preventing the (unfortunately very common, and potentially tricky to track down) problem of using an unassigned variable.

PHP: Using the ternary operator for something else than assignments – valid use case?

Unfortunately I haven't found any official resource on this.
Is it allowed to use the ternary operator like this, to shorten and if/else statement:
(isset($someVar) ? $this->setMyVar('something') : $this->setMyVar('something else'));
In the PHP documentation, the ternary operator is explained with this example:
$action = (empty($_POST['action'])) ? 'standard' : $_POST['action'];
This makes me believe that my use case might work, but it not really valid because a setter function does not return anything.
Yes, you can. From the PHP Doc:
[...] the ternary operator is an expression, and [...] it doesn't evaluate to a variable, but to the result of an expression.
That quoted, although the ternary is mostly used for assigning values, you can use it as you suggested because a function call is an expression so the appropriate function will be evaluated (and therefore executed).
If your setter function would return a value, it would simply not be assigned to anything and would therefore be lost. However, since you said your setter doesn't return anything, the whole ternary operator will evaluate to nothing and return nothing. That's fine.
If this is more readable than a regular if/else is a different story. When working in a team, I would suggest to rather stick to a regular if/else.
Or, how about going with this syntax, which would be more common?
$this->myVar = isset($someVar) ? 'something' : 'something else';
Or, using your setter:
$this->setMyVar(isset($someVar) ? 'something' : 'something else');

Any more concise way to set default values?

Since PHP 5.3, it is possible to leave out the middle part of the
ternary operator. Expression expr1 ?: expr3 returns expr1 if expr1
evaluates to TRUE, and expr3 otherwise.
Is there any better or more concise way than following code to set default value of variables?
$v = isset($v) ? $v : "default value";
TL;DR - No, that expression can't be made any shorter.
What you want is for the shortened ternary expression to perform an implicit isset(). This has been discussed on the mailing list and an ifsetor RFC has been created that covers the concept as well.
Since the shortened ternary operator already existed at the time of the above discussion, something like this was proposed using a non-existent operator ??:
// PROPOSAL ONLY, DOES NOT WORK
$v = $v ?? 'default value';
Assign 'default value' if $v is undefined.
However, nothing like this has been implemented in the main language to date. Until then, what you have written can't be made any shorter.
This horrible construct is shorter, but note that it's not the same because it assigns the default value if the variable exists but evaluates to false:
// DO NOT USE
$v = #$v ?: 'default value';
Here is a shorter syntax:
isset($v) || $v="default value";
Just asked this and was pointed here. So in case you use a key of an array, this might be an improvement
function isset_get($array, $key, $default = null) {
return isset($array[$key]) ? $array[$key] : $default;
}
Nope. That's the right way if you don't really know whether $v is set.
No way.If you use ternary operator.

PHP Simplify a ternary operation

In PHP, is there a way to simplify this even more, without using an if()?
$foo = $bar!==0 ? $foo : '';
I was wondering if there was a way to not reassign $foo to itself if the condition is satisfied. I understand there is a way to do this in Javascript (using &&, right?), but was wondering if there was a way to do this in PHP.
In PHP 5.3 the short form of the ternary operator has finally arrived, so you can do the following.
$foo = $bar ?: '';
See the Comparison Operators section - "Since PHP 5.3, it is possible to leave out the middle part of the ternary operator. Expression expr1 ?: expr3 returns expr1 if expr1 evaluates to TRUE, and expr3 otherwise."
Yup, you can use the logical and (&&) operator in PHP as well.
$bar === 0 && $foo = '';

What are the PHP operators "?" and ":" called and what do they do?

What are the ? and : operators in PHP?
For example:
(($request_type == 'SSL') ? HTTPS_SERVER : HTTP_SERVER)
This is the conditional operator.
$x ? $y : $z
means "if $x is true, then use $y; otherwise use $z".
It also has a short form.
$x ?: $z
means "if $x is true, then use $x; otherwise use $z".
People will tell you that ?: is "the ternary operator". This is wrong. ?: is a ternary operator, which means that it has three operands. People wind up thinking its name is "the ternary operator" because it's often the only ternary operator a given language has.
I'm going to write a little bit on ternaries, what they are, how to use them, when and why to use them and when not to use them.
What is a ternary operator?
A ternary ? : is shorthand for if and else. That's basically it. See "Ternary Operators" half way down this page for more of an official explanation.
As of PHP 5.3:
Since PHP 5.3, it is possible to leave out the middle part of the ternary operator. Expression expr1 ?: expr3 returns expr1 if expr1 evaluates to TRUE, and expr3 otherwise.
As of PHP 7.0
PHP 7 has new Null Coalesce Operator. This is the same as a ternary but is also called an "isset ternary". This also allows a set of chained ternaries that remove the need for isset() checks.
In PHP 5, if you wanted to use a ternary with a potentially non-existent variable then you would have to perform an isset() at the beginning of the ternary statement:
$result = isset($nonExistentVariable) ? $nonExistentVariable : ‘default’;
In PHP 7, you can now do this instead:
$result = $nonExistentVariable ?? ‘default’;
The Null Coalesce Operator does not work with an empty string, however, so bear that in mind. The great thing about this is you can also chain the operators for multiple checks for multiple variables, providing a sort of backup depending on whether or not each variable in the chain exists:
$user = $userImpersonatingAnotherUser ?? $loggedInUser ?? “Guest”;
In PHP, with systems where a user can login, it is not uncommon for an administrator to be able to impersonate another user for testing purposes. With the above example, if the user is not impersonating another user, and also a logged in user does not exist, then the user will be a guest user instead. Read on more if you don't understand this yet to see what ternaries are and how they are used, and then come back to this bit to see how the new PHP
How are ternaries used?
Here's how a normal if statement looks:
if (isset($_POST['hello']))
{
$var = 'exists';
}
else
{
$var = 'error';
}
Let's shorten that down into a ternary.
$var = isset($_POST['hello']) ? 'exists' : 'error';
^ ^ ^ ^ |
| then | else |
| | |
if post isset $var=this $var=this
Much shorter, but maybe harder to read. Not only are they used for setting variables like $var in the previous example, but you can also do this with echo, and to check if a variable is false or not:
$isWinner = false;
// Outputs 'you lose'
echo ($isWinner) ? 'You win!' : 'You lose';
// Same goes for return
return ($isWinner) ? 'You win!' : 'You lose';
Why do people use them?
I think ternaries are sexy. Some developers like to show off, but sometimes ternaries just look nice in your code, especially when combined with other features like PHP 5.4's latest short echos.
<?php
$array = array(0 => 'orange', 1 => 'multicoloured');
?>
<div>
<?php foreach ($array as $key => $value) { ?>
<span><?=($value==='multicoloured')?'nonsense':'pointless'?></span>
<?php } ?>
</div>
<!-- Outputs:
<span>
pointless
</span>
<span>
nonsense
</span>
-->
Going off-topic slightly, when you're in a 'view/template' (if you're seperating your concerns through the MVC paradigm), you want as little server-side logic in there as possible. So, using ternaries and other short-hand code is sometimes the best way forward. By "other short-hand code", I mean:
if ($isWinner) :
// Show something cool
endif;
Note, I personally do not like this kind of shorthand if / endif nonsense
How fast is the ternary operator?
People LIKE micro-optimisations. They just do. So for some, it's important to know how much faster things like ternaries are when compared with normal if / else statements.
Reading this post, the differences are about 0.5ms. That's a lot!
Oh wait, no it's not. It's only a lot if you're doing thousands upon thousands of them in a row, repeatedly. Which you won't be. So don't worry about speed optimisation at all, it's absolutely pointless here.
When not to use ternaries
Your code should be:
Easy to read
Easy to understand
Easy to modify
Obviously this is subject to the persons intelligence and coding knowledge / general level of understanding on such concepts when coming to look at your code. A single simple ternary like the previous examples are okay, something like the following, however, is not what you should be doing:
echo ($colour === 'red') ? "Omg we're going to die" :
($colour === 'blue' ? "Ah sunshine and daisies" :
($colour === 'green' ? "Trees are green"
: "The bloody colour is orange, isn't it? That was pointless."));
That was pointless for three reasons:
Ridiculously long ternary embedding
Could've just used a switch statement
It was orange in the first place
Conclusion
Ternaries really are simple and nothing to get too worked up about. Don't consider any speed improvements, it really won't make a difference. Use them when they are simple and look nice, and always make sure your code will be readable by others in the future. If that means no ternaries, then don't use ternaries.
It's called a ternary operator. If the first expression evaluates to true, HTTPS_SERVER is used, else HTTP_SERVER is chosen.
It's basically a shorthand if statement, and the above code could also be rewritten as follows:
if ($request_type == 'SSL') {
HTTPS_SERVER;
}
else {
HTTP_SERVER;
}
This is sometimes known as the ternary conditional operator. Ternary means that it has three arguments, as x ? y : z. Basically, it checks if x is true; if it is, then put y instead of this operation, otherwise z.
$hello = $something ? "Yes, it's true" : "No, it's false";
Conditional operator ? : is an operator which is used to check a condition and select a value depending on the value of the condition. It is expressed in the following form:
variable = condition ? expression1 : expression2;
It works as follows...
Firstly, condition is evaluated.
If the condition is true, then expression1 is evalauated. And the value of expression1 is assigned to the variable.
If the condition is false, then expression2 is evaluated. And the value of expression2 is assigned to the variable.
For example:
x = (a>b) ? 5 : 9
In this, for x, firstly the condition (a>b) is evaluated. If this condition becomes true, then x will become the value 5 (ie, x=5). But if the condition (a>b) becomes false, then x will attain the value 9 (ie, x=9).
Ternary Operator
Sometimes conditional operator ? : is also called a ternary operator. This is so because it involves three operands. For example:
x ? y : z
Here, x,y and z are the three operands. If condition x is true, then value y is assigned otherwise value z is assigned.
This is a short way of writing if sentences. It is also used in other languages like Java, JavaScript and others.
Your code,
$protocol = $request_type == 'SSL' ? HTTPS_SERVER : HTTP_SERVER;
can be written like this:
if ($request_type == 'SSL')
$protocol = HTTPS_SERVER;
else
$protocol = HTTP_SERVER;
That is a one line if statement:
condition ? true : false
Translated to an ordinary if statement in your case, that would be:
if($request_type == 'SSL') HTTPS_SERVER;
else HTTP_SERVER;
That's basically a fancy way of writing an if-else statement. Some say it's easier to read, some say not.
Ternary operator at Wikipedia
This works like an if statement it's very simple and easy once you get used to it.
(conditions_expressions) ? what_to_do_if_true : what_to_do_if_false.
As John T says, it is called a ternary operator and is essentially a shorthand version of an if /else statement. Your example, as a full if / else statement, would read;
if($request_type == 'SSL')
{
HTTPS_SERVER;
}
else
{
HTTP_SERVER;
}

Categories