Reputation: 13412
There are few nice ways to write shorthands in PHP.
!isset( $search_order ) && $search_order = 'ASC';
!isset( $search_order ) ? $search_order = 'ASC' : $search_order = NULL;
!isset( $_POST['unique_id'] ) && preg_match( '/^[a-zA-Z0-9]{8}$/', $_POST['unique_id'] ) ? $post_unique_id = $_POST['unique_id'] : $post_unique_id = NULL;
But how do we use examples above with functions and return, example:
function filter_gender_request($data) {
preg_match('/(fe)?male/i', $data, $data);
isset($data[0]) && return $data[0]; // It doesn't work here with return
}
At the same time, if I state the following, instead of isset($data[0]) && return $data[0];
then everything works as expected:
if (isset($data[0]) ) {
return $data[0];
}
What am I doing wrong here? If the very first and shortest example works outside of function flawlessly, why then it doesn't work with return?
Is there a possibility to use shorthands with return?
Upvotes: 14
Views: 34912
Reputation: 683
For future googlers.
Use php 7 null coalesce (??) operator
return $data[0] ?? null;
Upvotes: 28
Reputation: 360762
Your amazing shortcut is actually rather hideous code. You are abusing the ternary operator, and that code is actually far LESS readable AND less maintainable than if you'd written it out. People expect ternaries to perform a test and return an either/or value. Performing assignment within it is NOT normal behavior.
Upvotes: 14
Reputation: 39
The problem with your code is you are trying to execute a return
statement as part of the ternary expression. The ternary operator generally results in an assignment as in:
$message = is_error() ? get_error() : 'No Errors';
This results in an assignment to $message
based on the return value of is_error()
. Your code is trying to process a program control statement within the operation. return
cannot be assigned to the variable.
For this reason, what the other users have posted are better options for your situation.
Upvotes: 4
Reputation: 4793
Agreeing with what has been answered here, that shorthand is harder to read once you've gone away from it and come back, or worse, another developer in the future.
Imagine yourself with even a small 500 line script file, with 40 lines of shorthand elseif as you use it, would you be ok trying to add or change code?
Especially when the subject or content is not something you're familiar with, it becomes a headache to debug or make additions.
This is much more manageable and doesn't matter what it's about, it's just code:
if ($var == 'unicorns')
{
$this->remove_horn;
}
elseif ($var == 'horse')
{
$this->glue_on_horn;
}
else
{
$this->must_be_a_zebra;
}
just saying
Upvotes: 1
Reputation: 4432
oke I don't know what you are doing but this should work:
return ( isset($data[0]) ? $data[0] : false);
Upvotes: 2
Reputation: 59709
With your current syntax, what do you expect your function to return when $data[0]
is not set? Surely you don't expect your function to not return anything, depending upon a condition.
The only alternative I see is the ternary operator, where you return something other than $data[0]
when it is not set:
return isset($data[0]) ? $data[0] : null;
Upvotes: 36