2014-09-02 36 views
0

PHP中有一种简单的方法来确定内置函数的源代码/内容吗?如何在PHP中查看内置函数的源代码/内容?

举例来说,我想知道base64_decode()实际上对给定的编码base64字符串做了什么以将其转换为纯文本。我怎样才能做到这一点?

+2

我有这个书签:http://lxr.php.net/甚至esier你:HTTP://lxr.php.net/xref/PHP_5_5/ext /standard/base64.c#240 - http://lxr.php.net/xref/PHP_5_5/ext/standar d/base64.c#php_base64_decode_ex – 2014-09-02 20:22:13

+0

什么是一个很好的资源。非常感谢@Dagon正是我在寻找的东西 – 2014-09-02 20:23:50

回答

2

您可以浏览PHP here

的源代码在你的情况base64_decode实现here (PHP 5.6.0)

注:此代码是用C,因为这就是PHP写的其实所有的内置功能。和PHP扩展C语言编写的

PHPAPI unsigned char *php_base64_decode_ex(const unsigned char *str, int length, int *ret_length, zend_bool strict) /* {{{ */ 
{ 
    const unsigned char *current = str; 
    int ch, i = 0, j = 0, k; 
    /* this sucks for threaded environments */ 
    unsigned char *result; 

    result = (unsigned char *)safe_emalloc(length, 1, 1); 

    /* run through the whole string, converting as we go */ 
    while ((ch = *current++) != '\0' && length-- > 0) { 
     if (ch == base64_pad) { 
      if (*current != '=' && ((i % 4) == 1 || (strict && length > 0))) { 
       if ((i % 4) != 1) { 
        while (isspace(*(++current))) { 
         continue; 
        } 
        if (*current == '\0') { 
         continue; 
        } 
       } 
       efree(result); 
       return NULL; 
      } 
      continue; 
     } 

     ch = base64_reverse_table[ch]; 
     if ((!strict && ch < 0) || ch == -1) { /* a space or some other separator character, we simply skip over */ 
      continue; 
     } else if (ch == -2) { 
      efree(result); 
      return NULL; 
     } 

     switch(i % 4) { 
     case 0: 
      result[j] = ch << 2; 
      break; 
     case 1: 
      result[j++] |= ch >> 4; 
      result[j] = (ch & 0x0f) << 4; 
      break; 
     case 2: 
      result[j++] |= ch >>2; 
      result[j] = (ch & 0x03) << 6; 
      break; 
     case 3: 
      result[j++] |= ch; 
      break; 
     } 
     i++; 
    } 

    k = j; 
    /* mop things up if we ended on a boundary */ 
    if (ch == base64_pad) { 
     switch(i % 4) { 
     case 1: 
      efree(result); 
      return NULL; 
     case 2: 
      k++; 
     case 3: 
      result[k] = 0; 
     } 
    } 
    if(ret_length) { 
     *ret_length = j; 
    } 
    result[j] = '\0'; 
    return result; 
} 
相关问题