PHP 输出字符串

本文最后更新于:2024年3月18日 凌晨

PHP 输出字符串

  • 有4种方法可以向浏览器发送输出内容,echo结构让你一次输出许多值,而print()只能输出一个值,printf()函数通过把值插入到模板中来建立一个格式化的字符串,print_r()函数利于调试–它用更容易读懂的方式来打印数组,对象和其他东西的内容。

echo

  • 要把一个字符串放到PHP生成的HTML页面中,可以使用echo,echo的大部分行为看起来像是一个函数,但其实echo是一个语言结构(language construct),这意味着可以省略小括号,所以下面两个语句是等价的:
1
2
echo "Printy";
echo ("Printy"); // 也是合法的。
  • 可以通过逗号分隔来指定打印多少项:
1
echo "First","second","third";
  • 在尝试echo多个值时,使用小括号会产生语法错误:
1
2
// 这是一个语法错误。
echo ("Hello","word");
  • 因为echo并不是真正的函数,所以不可以把它作为表达式的一部分使用:
1
2
3
4
// 语法错误。
if(echo("test")){
echo ("it worked");
}
  • 通过使用函数print()printf(),很容易补救这种错误。

print()

  • 函数print()发送一个值(它的参数)给浏览器,如果字符串成功显示则返回ture,否则返回false(例如,用户在页面提交之前按下stop按钮):
1
2
3
4
5
if(!print("Hello,World"){
die("you 're not listening to me!");
}

Hello,World

printf()

  • 函数printf()通过把值传入到模板中(即定义好的字符串格式)来输出一个字符串,它源自在标准C库中的同名函数。
  • printf()的第一个参数时格式字符串,剩下的参数是要替换进来的值,在格式字符串中的每个字符%指定一个替换。

格式修饰符

  • 在模板中的每一个替换标记由一个百分号%组成,后面可能跟着一个在下面列表中的修饰符,并以类型说明符结尾(在输出中使用%%得到一个百分号)修饰符必须按下面列出的次序出现:
    • 填充说明符说明该字符用于填充结果,使结果为适当大小的字符串,规定0,一个空白符或其他任意以单引号作为前缀的字符,默认用空白符填充。
    • 一个符号,符号在字符串和数字上的作用是不同的,对于字符串,负号-强制字符串向左对齐(默认是向右对齐),对于数字,正号+强制正数和开始的加号一起打印(例如,35被打印为+35)
    • 这个元素包含字符的最小数目,如果结果小于字符的数目,正负号和填充说明符将决定如何填充到这个长度。
    • 浮点数的精确性说明符由一个小数点和数字组成,这个说明符规定了小数点后多少位可以被显示,对于其他非双精度的类型,这个说明符将被忽略。

类型说明符

  • 类型说明符告诉printf()什么样的数据类型将被替换。这决定了对前面列出的修饰符的解释,在下表中列出了这8种类型。
说明符 意义
B 参数是整数并且以二进制数显示
C 参数是整数并且显示值对应的字符
D 参数是整数并且以十进制数显示
e or f 参数是双精度型并且以浮点数显示
G 参数是双精度型(double with precision)并且以浮点数显示
O 参数是整型并且以八进制(以8为基数)数显示
S 参数是字符串并且显示为字符串
U 参数是无符号整数并且以十进制数显示
x 参数是整数并且以十六进制(以16为基数)数显示,使用小写字母
X 参数是整数并且以十六进制数显示,使用大写字母
  • 函数printf()对于不是C程序员的人来说看起来非常复杂,然而一旦习惯之后,会发现它是一个强大的格式化工具,下面是一些例子:
  • 将一个浮点数转换成只有两位小数的小数:
1
2
3
printf('%.2f',27.452);

27.15
  • 输出十进制和十六进制数:
1
2
3
printf('The hex value of %d is %x',214,214);

The hex value of 214 is d6
  • 填充整数,使长度达到3位:
1
2
3
printf('Bond.James Bond.%03d.',7);

Bond.James Bond.007
  • 格式化一个日期。
1
2
3
printf('%02d/%02d/%04d',$mouth,$day,%year);

02/15/2005
  • 百分比:
1
2
3
printf('%.2f%%Completed',2.1);

2.10% Completed
  • 填充一个浮点数:
1
2
3
print('You\'ve spent $%5.2f so far ',4.1);

You've spent $ 4.10 so far
  • 函数sprintf()printf()的参数相同,但只是返回生成的字符串而不打印出来,这可以让你把字符串保存到一个变量中供稍后使用:
1
$date = sprintf("%02d/%02d/%04d",$mouth,$day,$yyear);	// 现在我们可以在任何一个需要日期的地方将类型说明符%d替换成$date的值。
  • print_r()结构可以聪明地显示传给它的东西,而不是像echoprint()那样把所有的都转换为字符串,使用print_r(),字符串和数字都简单地打印出来,而数组则以括起来的键和值的列表形式显示,并以Array开头:
1
2
3
4
5
6
7
8
9
$a = array('name' => 'Fred','age' => 35,'wife' => 'Wilma');
print_r($a);

Array
{
[name] => Fred
[age] => 35
[wife] =>Wilma
}
  • 在数组中使用print_r()将移动内部的迭代器指针到数组里最后一个元素的位置。
  • 当对一个对象使用print_r()时,你将会看到单词Object,之后是该对象的初始化属性,像数组一样地显示:
1
2
3
4
5
6
7
8
9
10
11
class P{
var $name = 'nat';
//...
}
$p = new P;
print_r($p);

Object
(
[name] =>nat
)
  • print_r输出布尔值和NULL的结果是没有意义的:
1
2
3
print_r(true);	// 打印"\n";
print_r(false); // 打印"\n";
print_r(NULL); // 打印"\n";
  • 由于这个原因,var_dump()print_r()更适合调试。
  • 函数var_dump()以更适合阅读的格式显示任何PHP值:
1
2
3
var_dump(true);

bool(true);
1
2
3
var_dump(false);

bool(false);
1
2
3
4
5
6
7
8
var_dump(array('name' => Fred,'age' =>35));

array(2){
["name"] =>
string(4) "Fred"
["age"] =>
int(35)
}
1
2
3
4
5
6
7
8
9
10
class P{
var $name = 'Nat';
}
$p = new P;
var_dump($p);

object(p)(1){
["name"] =>
string(3) "Nat"
}
  • 在递归结构中(如$GLOBALS有一个GLOBALS的入口指向自身)要注意print_r()var_dump()的使用,var_dump()在访问同一个元素3次后会停止,而函数print_r()则无限循环。

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!