Can't set PHP block visibility programatically
Re: https://api.drupal.org/api/drupal/modules!block!block.api.php/function/hook_block_info/7 you have to put the actual PHP code "in" the pages array key...


  For BLOCK_VISIBILITY_PHP, the PHP code's return value should be TRUE if
  the block is to be made visible or FALSE if the block should not be
  visible.


...not set it to the return of a function, eg, something along these lines:

$blocks['membership_package_information'] = array( 
    'info' =&gt; "Membership Package Information",
    'visibility' =&gt; BLOCK_VISIBILITY_PHP,
    'pages' =&gt; '&lt;?php return membership_block_visibility(); ?&gt;' // ADDITION: you need the &lt;?php ?&gt; brackets :)
);

// make sure this function is in a module file that is always loaded...

function membership_block_visibility() {
  if(arg(0) == 'checkout' &amp;&amp; arg(2) == null) {
    return true;
  }
  else {
    return false;
  }
}


Do also note the caveat off the api page:


  Most modules do not provide an initial value for 'visibility' or
  'pages', and any value provided can be modified by a user on the block
  configuration screen.