protected function linkify(\Reflector $reflector, $constant = null){

    static $docRefRoot = null, $docRefExt = null;

    // most people don't have this set
    if(!$docRefRoot)
      $docRefRoot = ($docRefRoot = rtrim(ini_get('docref_root'), '/')) ? $docRefRoot : 'http://php.net/manual/en';

    if(!$docRefExt)
      $docRefExt = ($docRefExt = ini_get('docref_ext')) ? $docRefExt : '.php';

    $phpNetSchemes = array(
      'class'     => $docRefRoot . '/class.%s'    . $docRefExt,
      'function'  => $docRefRoot . '/function.%s' . $docRefExt,
      'method'    => $docRefRoot . '/%2$s.%1$s'   . $docRefExt,
      'property'  => $docRefRoot . '/class.%2$s'  . $docRefExt . '#%2$s.props.%1$s',
      'constant'  => $docRefRoot . '/class.%2$s'  . $docRefExt . '#%2$s.constants.%1$s',
    );

    $url  = null;
    $args = array();

    // determine scheme
    if($constant !== null){
      $type = 'constant';
      $args[] = $constant;

    }else{
      $type = explode('\\', get_class($reflector));
      $type = strtolower(ltrim(end($type), 'Reflection'));

      if($type === 'object')
        $type = 'class';
    }

    // properties don't have the internal flag;
    // also note that many internal classes use some kind of magic as properties (eg. DateTime);
    // these will only get linkifed if the declared class is internal one, and not an extension :(
    $parent = ($type !== 'property') ? $reflector : $reflector->getDeclaringClass();

    // internal function/method/class/property/constant
    if($parent->isInternal()){
      $args[] = $reflector->name;

      if(in_array($type, array('method', 'property'), true))
        $args[] = $reflector->getDeclaringClass()->getName();

      $args = array_map(function($text){
        return str_replace('_', '-', ltrim(strtolower($text), '\\_'));
      }, $args);

      // check for some special cases that have no links
      $valid = (($type === 'method') || (strcasecmp($parent->name, 'stdClass') !== 0))
            && (($type !== 'method') || (($reflector->name === '__construct') || strpos($reflector->name, '__') !== 0));

      if($valid)
        $url = vsprintf($phpNetSchemes[$type], $args);

    // custom
    }else{
      switch(true){

        // WordPress function;
        // like pretty much everything else in WordPress, API links are inconsistent as well;
        // so we're using queryposts.com as doc source for API
        case ($type === 'function') && class_exists('WP') && defined('ABSPATH') && defined('WPINC'):
          if(strpos($reflector->getFileName(), realpath(ABSPATH . WPINC)) === 0){
            $url = sprintf('http://queryposts.com/function/%s', urlencode(strtolower($reflector->getName())));
            break;
          }

        // @todo: handle more apps
      }

    }

    return $url;
  }
protected function linkify(\Reflector $reflector, $constant = null){

    static $docRefRoot = null, $docRefExt = null;

    // most people don't have this set
    if(!$docRefRoot)
      $docRefRoot = ($docRefRoot = rtrim(ini_get('docref_root'), '/')) ? $docRefRoot : 'http://php.net/manual/en';

    if(!$docRefExt)
      $docRefExt = ($docRefExt = ini_get('docref_ext')) ? $docRefExt : '.php';

    $phpNetSchemes = array(
      'class'     => $docRefRoot . '/class.%s'    . $docRefExt,
      'function'  => $docRefRoot . '/function.%s' . $docRefExt,
      'method'    => $docRefRoot . '/%2$s.%1$s'   . $docRefExt,
      'property'  => $docRefRoot . '/class.%2$s'  . $docRefExt . '#%2$s.props.%1$s',
      'constant'  => $docRefRoot . '/class.%2$s'  . $docRefExt . '#%2$s.constants.%1$s',
    );

    $url  = null;
    $args = array();

    // determine scheme
    if($constant !== null){
      $type = 'constant';
      $args[] = $constant;

    }else{
      $type = explode('\\', get_class($reflector));
      $type = strtolower(ltrim(end($type), 'Reflection'));

      if($type === 'object')
        $type = 'class';
    }

    // properties don't have the internal flag;
    // also note that many internal classes use some kind of magic as properties (eg. DateTime);
    // these will only get linkifed if the declared class is internal one, and not an extension :(
    $parent = ($type !== 'property') ? $reflector : $reflector->getDeclaringClass();

    // internal function/method/class/property/constant
    if($parent->isInternal()){
      $args[] = $reflector->name;

      if(in_array($type, array('method', 'property'), true))
        $args[] = $reflector->getDeclaringClass()->getName();

      $args = array_map(function($text){
        return str_replace('_', '-', ltrim(strtolower($text), '\\_'));
      }, $args);

      // check for some special cases that have no links
      $valid = (($type === 'method') || (strcasecmp($parent->name, 'stdClass') !== 0))
            && (($type !== 'method') || (($reflector->name === '__construct') || strpos($reflector->name, '__') !== 0));

      if($valid)
        $url = vsprintf($phpNetSchemes[$type], $args);

    // custom
    }else{
      switch(true){

        // WordPress function;
        // like pretty much everything else in WordPress, API links are inconsistent as well;
        // so we're using queryposts.com as doc source for API
        case ($type === 'function') && class_exists('WP') && defined('ABSPATH') && defined('WPINC'):
          if(strpos($reflector->getFileName(), realpath(ABSPATH . WPINC)) === 0){
            $url = sprintf('http://queryposts.com/function/%s', urlencode(strtolower($reflector->getName())));
            break;
          }

        // @todo: handle more apps
      }

    }

    return $url;
  }
protected function linkify ( \ Reflector $ reflector , $ constant = null ) { static $ docRefRoot = null , $ docRefExt = null ; // most people don't have this set if ( ! $ docRefRoot ) $ docRefRoot = ( $ docRefRoot = rtrim ( ini_get ( 'docref_root' ) , '/' ) ) ? $ docRefRoot : 'http://php.net/manual/en' ; if ( ! $ docRefExt ) $ docRefExt = ( $ docRefExt = ini_get ( 'docref_ext' ) ) ? $ docRefExt : '.php' ; $ phpNetSchemes = array ( 'class' => $ docRefRoot . '/class.%s' . $ docRefExt , 'function' => $ docRefRoot . '/function.%s' . $ docRefExt , 'method' => $ docRefRoot . '/%2$s.%1$s' . $ docRefExt , 'property' => $ docRefRoot . '/class.%2$s' . $ docRefExt . '#%2$s.props.%1$s' , 'constant' => $ docRefRoot . '/class.%2$s' . $ docRefExt . '#%2$s.constants.%1$s' , ) ; $ url = null ; $ args = array ( ) ; // determine scheme if ( $ constant !== null ) { $ type = 'constant' ; $ args [ ] = $ constant ; } else { $ type = explode ( '\\' , get_class ( $ reflector ) ) ; $ type = strtolower ( ltrim ( end ( $ type ) , 'Reflection' ) ) ; if ( $ type === 'object' ) $ type = 'class' ; } // properties don't have the internal flag; // also note that many internal classes use some kind of magic as properties (eg. DateTime); // these will only get linkifed if the declared class is internal one, and not an extension :( $ parent = ( $ type !== 'property' ) ? $ reflector : $ reflector -> getDeclaringClass ( ) ; // internal function/method/class/property/constant if ( $ parent -> isInternal ( ) ) { $ args [ ] = $ reflector -> name ; if ( in_array ( $ type , array ( 'method' , 'property' ) , true ) ) $ args [ ] = $ reflector -> getDeclaringClass ( ) -> getName ( ) ; $ args = array_map ( function ( $ text ) { return str_replace ( '_' , '-' , ltrim ( strtolower ( $ text ) , '\\_' ) ) ; } , $ args ) ; // check for some special cases that have no links $ valid = ( ( $ type === 'method' ) || ( strcasecmp ( $ parent -> name , 'stdClass' ) !== 0 ) ) && ( ( $ type !== 'method' ) || ( ( $ reflector -> name === '__construct' ) || strpos ( $ reflector -> name , '__' ) !== 0 ) ) ; if ( $ valid ) $ url = vsprintf ( $ phpNetSchemes [ $ type ] , $ args ) ; // custom } else { switch ( true ) { // WordPress function; // like pretty much everything else in WordPress, API links are inconsistent as well; // so we're using queryposts.com as doc source for API case ( $ type === 'function' ) && class_exists ( 'WP' ) && defined ( 'ABSPATH' ) && defined ( 'WPINC' ) : if ( strpos ( $ reflector -> getFileName ( ) , realpath ( ABSPATH . WPINC ) ) === 0 ) { $ url = sprintf ( 'http://queryposts.com/function/%s' , urlencode ( strtolower ( $ reflector -> getName ( ) ) ) ) ; break ; } // @todo: handle more apps } } return $ url ; }
Generates an URL that points to the documentation page relevant for the requested context

For internal functions and classes, the URI will point to the local PHP manual
if installed and configured, otherwise to php.net/manual (the english one)

@param   Reflector $reflector    Reflector object (used to determine the URL scheme for internal stuff)
@param   string|null $constant   Constant name, if this is a request to linkify a constant
@return  string|null             URL
Generates an URL that points to the documentation page relevant for the requested context