Operator precedence gets me every time!

While working on a module last night, I couldn't figure out why I couldn't get caching to work. I have done object caching at least a dozen times before but I couldn't figure out why I was not able to get the cached object back. Here's the code I was using:

<?php
 
if($cache = cache_get($cid, 'cache') && $cache->data) {
   
dsm('Cached!');
    return
$cache->data;
  }
?>

I finally realized that cache_get() was indeed returning a cache object, but the code inside the if statement was never executing.

Then I saw my mistake. The && operator has a higher precedence that the = (assignment) operator, so the above statement is similar to this:

<?php
 
if($cache = (cache_get($cid, 'cache') && $cache->data)) {
    ...
  }
?>

So the solution is simply to wrap the assignment in parenthesis like so:

<?php
 
if(($cache = cache_get($cid, 'cache')) && $cache->data) {
   
dsm('Cached!');
    return
$cache->data;
  }
?>

0 Comments

    Post new comment

    • Web page addresses and e-mail addresses turn into links automatically.
    • Allowed HTML tags: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>
    • Lines and paragraphs break automatically.

    More information about formatting options