Marcus Edensky
Marcus Edensky

Reputation: 944

PHP E_NOTICE best practice - Is it bad to check an undefined var for a value?

With E_NOTICE error messages enabled, PHP doesn't like the following code, unless the variables $mdDialog and $mdToast have already been defined:

if ($mdDialog || $mdToast) {
    $ngMaterial = true;
}

To avoid E_NOTICE error, I must write:

if (isset($mdDialog) || isset($mdToast)) {
    $ngMaterial = true;
}

The problem is that, with the above code, if I have a $mdDialog = false; line somewhere earlier, the statement will be truthy, which is not the idea. To avoid this, I'd have to write:

if ((isset($mdDialog) && $mdDialog) || (isset($mdToast) && $mdToast)) {
    $ngMaterial = true;
}

And this is sooo much longer and feels excessive, only to avoid the E_NOTICE message.

So, the question is, should I care about these E_NOTICE messages? Is there anything bad with checking the value of a variable that may not exist?

Upvotes: 1

Views: 183

Answers (3)

Alex Howansky
Alex Howansky

Reputation: 53573

You're always better off avoiding generating notices than setting error_reporting() to ignore them. That said, in cases like this, it's almost always easier to make sure that the vars are set at the start than it is to check that they're set every place you refer to them. I.e., the var never gets set for the false condition if you do something like this:

if (some condition) {
    $flag = true;
}

Instead do something like this:

if (some condition) {
    $flag = true;
} else {
    $flag = false;
}

Or this:

$flag = false;
if (some condition) {
    $flag = true;
}

Or this:

$flag = (some condition) ? true : false;

Or this:

$flag = (bool) (some condition);

Now you don't need isset() or empty(), and when you get an E_NOTICE, it's actually meaningful.

Upvotes: 0

sach jot
sach jot

Reputation: 570

Or if the variable is a string you can also use this:

if(strlen($mdDialog) < 1 || strlen($mdToast) < 1){
     $ngMaterial = true;
 } 

Upvotes: 1

Lovepreet Singh
Lovepreet Singh

Reputation: 4850

empty can be useful in this case. Like below:

if (!empty($mdDialog) || !empty($mdToast)) {
    $ngMaterial = true;
}

Read more about empty.

Upvotes: 4

Related Questions