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