php sprintf函数的php源代码

时间:2017-07-17 08:04:28

标签: php printf

现在我有一个关于如何查看sprintf php函数的源代码的问题。因为我想知道函数在哪里以及如何执行。 我可以通过grep -r 'PHP_FUNCTION(round)'找到一些函数,例如math.c中的round函数,但是sprintf与round函数不相似。

2 个答案:

答案 0 :(得分:2)

有两种很好的方法可以查看PHP源代码。

首先,最简单的方法是使用IDE。例如在Netbeans ctrl+right click中,任何函数都会将您带到它的源头。毫无疑问,这种方法是最快的,在编写代码时,它是最容易理解函数如何工作的地方。

然而,您并不总能获得完整的来源。以sprintf为例,您只需获取以下内容即可。

/**
 * (PHP 4, PHP 5, PHP 7)<br/>
 * Return a formatted string
 * @link http://php.net/manual/en/function.sprintf.php
 * @param string $format <p>
 * The format string is composed of zero or more directives:
 * ordinary characters (excluding %) that are
 * copied directly to the result, and conversion
 * specifications, each of which results in fetching its
 * own parameter. This applies to both <b>sprintf</b>
 * and <b>printf</b>.
 * </p>
 * <p>
 * Each conversion specification consists of a percent sign
 * (%), followed by one or more of these
 * elements, in order:
 * An optional sign specifier that forces a sign
 * (- or +) to be used on a number. By default, only the - sign is used
 * on a number if it's negative. This specifier forces positive numbers
 * to have the + sign attached as well, and was added in PHP 4.3.0.
 * @param mixed $args [optional]
 * @param mixed $_ [optional]
 * @return string a string produced according to the formatting string
 * <i>format</i>.
 */
function sprintf(string $format, $args = null, $_ = null): string {}

对于99%的使用案例,我觉得上述内容足以理解该功能的工作方式,最重要的是,如何使用它。

另一种更加万无一失的方法是结帐PHP Git。以下是sprintf的实际来源:

#include <stdio.h>
#include <stdarg.h>
#include "php.h"
#ifdef PHP_WIN32
#include "config.w32.h"
#else
#include <php_config.h>
#endif

PHPAPI int
php_sprintf (char*s, const char* format, ...)
{
  va_list args;
  int ret;

  va_start (args, format);
  s[0] = '\0';
  ret = vsprintf (s, format, args);
  va_end (args);
  return (ret < 0) ? -1 : ret;
}

来源:https://github.com/php/php-src/blob/master/main/php_sprintf.c

答案 1 :(得分:1)

PHP实现使用php_formatted_print()内部函数来处理所有*printf() PHP函数(printf()sprintf()fprintf(),{{3 },vprintf()vsprintf())。它们都进行类似的处理,只有输出的目的地不同。

C函数vfprintf()(以这种方式命名以避免与标准C库提供的sprintf()函数冲突)被声明为user_sprintf()the implementation。< / p>

sprintf() PHP function非常简单(硬提升由Its code执行):

/* {{{ proto string sprintf(string format [, mixed arg1 [, mixed ...]])
   Return a formatted string */
PHP_FUNCTION(user_sprintf)
{
    zend_string *result;

    if ((result=php_formatted_print(execute_data, 0, 0))==NULL) {
        RETURN_FALSE;
    }
    RETVAL_STR(result);
}
/* }}} */

有类似的函数可以实现其他*printf() PHP函数。它们处理php_formatted_print()返回的值的方式不同。