Variable assignment using logical operators in PHP
Asked Answered
W

2

5

I've been trying to replicate short circuit evaluation in javascript for assignment.

E.g. in Javascript

var myObject = {foo: 'bar'};
// if myObject is undefined then assign an empty array
var obj = myObject || [];

obj will now reference myObject

I tried to replicate this in PHP and found that it just turns it into an expression and returns true or false.

I could do this in PHP like this:

$get = $this->input->get() ? $this->input->get() : array();

The problem with this is I don't know what $this->input->get() is doing behind the scenes so it's not efficient to call the method twice.

So I got creative and found a solution doing it as follows:

// $this->input->get() could return an array or false
$get = ($params = $this->input->get() and $params) ? $params : array();

Problem with this is it may confuse me in the future and it may not be very efficient.

So is there a better way in PHP to assign a variable in a one line expression like this or should I just stick to:

$get = $this->input->get();
if (!$get) {
   $get = array();
}
Windflower answered 19/12, 2013 at 12:46 Comment(2)
Why not have $this->input->get() return an empty query if it doesn't find anything?Twelfthtide
@BartFriederichs This method is part of a framework library and overriding it is not really an option. It's just an example anyway to explain my problem.Windflower
L
9

Since PHP 5.3, which you are hopefully using as anything else is ancient, there's the ternary ?: operator without the middle part (so, the "binary operator"...?):

$get = $this->input->get() ?: array();
Lonnie answered 19/12, 2013 at 12:52 Comment(1)
Awesome. I use the ternary operator a lot and just assumed I knew all there was to know about it instead of re-reading the manual. Thanks for lesson.Windflower
W
0

If you want to do it in one line...

$get = ($params = $this->input->get()) ? $params : array();

I don't think it's less efficient in any ways.
You can also do it like...

$get = $this->input->get() ?: array();

But, using this way, I am not sure whether $this->input->get() is called once or twice.

Warpath answered 19/12, 2013 at 12:50 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.