文档中没有提到,但heredoc末尾的结束分号实际上被解释为真正的分号,因此,有时会导致语法错误。
这项工作:
<? php(电话)
$foo美元 =<<<结束
美国广播公司
结束;
?>
这不会:
<? php(电话)
foo公司 (<<<END
美国广播公司
结束;
);
//语法错误,意外的“;”
?>
如果没有分号,则工作正常:
<? php(电话)
foo公司 (<<<END
美国广播公司
结束
);
?>
注释 : 在32位版本中 一串 最大可达2GB (最多2147483647字节)
<? php(电话)
回声 '这是一个简单字符串' ;
回声 '您还可以在中嵌入换行符
按原样串
可以这样做' ;
//输出:阿诺德曾经说过:“我会回来的”
回声 阿诺德曾经说过:“我会回来的” ;
//输出:您删除了C:\*.*?
回声 '您删除了C:\\*.*?' ;
//输出:您删除了C:\*.*?
回声 '您删除了C:\*.*?' ;
//输出:这不会展开:\n换行
回声 '这不会展开:\n换行' ;
//输出:变量也不$expand$
回声 '变量也不$expand$' ;
?>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<? php(电话)
//无压痕
回波<<<结束
一
b条
c(c)
\n个
结束;
//4格压痕
回波<<<结束
一
b条
c(c)
结束;
一 b条 c(c) 一 b条 c(c)
<? php(电话)
回波<<<结束
一
b条
c(c)
结束;
PHP分析错误:第4行example.PHP中的正文缩进级别无效(要求缩进级别至少为3)
<? php(电话)
//以下所有代码都不起作用。
//正文(空格)结束标记(制表符)的不同缩进
{
回波<<<结束
一
结束;
}
//混合车身中的空间和翼片
{
回波<<<结束
一
结束;
}
//在结束标记中混合空格和制表符
{
回波<<<结束
一
结束;
}
PHP解析错误:缩进无效-example.PHP第8行中不能混合制表符和空格
<? php(电话)
$值 =[<<<结束
一
b条
c(c)
结束, “d e f” ];
变量转储 ( $值 );
数组(2){ [0] => 字符串(11)“a b条 c“ [1] => 字符串(5)“d e f” }
<? php(电话)
$值 =[<<<结束
一
b条
结束 惯性导航与制导
结束 , “d e f” ];
PHP解析错误:语法错误,意外标识符“ING”,example.PHP第6行应为“]”
<? php(电话)
班 foo公司 {
公众的 $巴 =<<<EOT
酒吧
EOT;
}
//标识符不能缩进
?>
<? php(电话)
班 foo公司 {
公众的 $巴 =<<<EOT
酒吧
EOT;
}
?>
<? php(电话)
$str(美元) =<<<爆炸物处理
字符串示例
跨越多条线
使用heredoc语法。
爆炸物处理;
/*更复杂的例子,有变量*/
班 foo公司
{
无功功率,无功功率 $foo美元 ;
无功功率,无功功率 $巴 ;
功能 __构造 ()
{
$这个 -> foo公司 = “Foo” ;
$这个 -> 酒吧 =数组( “Bar1” , “Bar2” , “Bar3” );
}
}
$foo美元 =新 foo公司 ();
$名称 = “我的名字” ;
回波<<<EOT
我的名字是“ $名称 “.我正在打印一些 $foo美元 -> foo公司 .
现在,我正在打印一些 { $foo美元 -> 酒吧 [ 1 ]} .
这应该打印大写字母“a”:\x41
EOT;
?>
我的名字是“MyName”。 我正在打印一些Foo。 现在,我正在打印一些Bar2。 这应该打印大写字母“a”:a
<? php(电话)
变量转储 (阵列(<<<EOD
福巴!
地球观测站
));
?>
<? php(电话)
//静态变量
功能 foo公司 ()
{
静止的 $巴 =<<<标签
这里什么都没有。。。
标签;
}
//类属性/常量
班 foo公司
{
常量 酒吧 =<<<FOOBAR(福巴尔)
常量示例
FOOBAR公司;
公众的 美元baz =<<<FOOBAR(福巴尔)
属性示例
FOOBAR公司;
}
?>
<? php(电话)
echo<<<“FOOBAR”
你好,世界!
FOOBAR公司;
?>
<? php(电话)
echo<<<“爆炸物处理”
跨越多条线的字符串示例
使用nowdoc语法。 反斜杠总是按字面意思处理,
例如\\和\\'。
爆炸物处理;
跨越多条线的字符串示例 使用nowdoc语法。 反斜杠总是按字面意思处理, 例如\\和\\'。
<? php(电话)
班 foo公司
{
公众的 $foo美元 ;
公众的 $巴 ;
功能 __构造 ()
{
$这个 -> foo公司 = “Foo” ;
$这个 -> 酒吧 =数组( “Bar1” , “Bar2” , “Bar3” );
}
}
$foo美元 =新 foo公司 ();
$名称 = “我的名字” ;
echo<<<“EOT”
我的名字是“$name”。 我正在打印一些$foo->foo。
现在,我正在打印一些{$foo->bar[1]}。
这不应打印大写字母“a”:\x41
EOT;
?>
我的名字是“$name”。 我正在打印一些$foo->foo。 现在,我正在打印一些{$foo->bar[1]。 这不应该打印大写的“a”:\ x41
<? php(电话)
班 foo公司 {
公众的 $巴 =<<<“EOT”
酒吧
EOT;
}
?>
<? php(电话)
$果汁 = “苹果” ;
回声 “他喝了一些 $果汁 果汁。 " . PHP_终止 ;
//意外。 “s”是变量名的有效字符,所以它指的是$juice,而不是$juice。
回声 “他喝了一些果汁 $果汁 ” . PHP_终止 ;
//通过将引用括在大括号中,显式指定变量名的末尾。
回声 “他喝了一些果汁 { $果汁 } 秒。” ;
?>
他喝了一些苹果汁。 他喝了一些果汁。 他喝了一些苹果汁。
<? php(电话)
$果汁 =数组( “苹果” , “橙色” , “koolaid1” => “紫色” );
回声 “他喝了一些 $果汁 [ 0 ] 果汁。 " . PHP_终止 ;
回声 “他喝了一些 $果汁 [ 1 ] 果汁。 " . PHP_终止 ;
回声 “他喝了一些 $果汁 [ 科奥莱德1 ] 果汁。 " . PHP_终止 ;
班 人 {
公众的 $约翰 = “约翰·史密斯” ;
公众的 $简 = “简·史密斯” ;
公众的 $罗伯特 = “罗伯特·鲍尔森” ;
公众的 $史密斯 = “史密斯” ;
}
$人 =新 人 ();
回声 " $人 -> 厕所 喝了一些 $果汁 [ 0 ] 果汁。 " . PHP_终止 ;
回声 " $人 -> 厕所 然后向问好 $人 -> 简 ” . PHP_终止 ;
回声 " $人 -> 厕所 的妻子打招呼 $人 -> 罗伯特 ” . PHP_终止 ;
回声 " $人 -> 罗伯特 向这两个人打招呼 $人 -> 史密斯 ” ; //行不通
?>
他喝了一些苹果汁。 他喝了一些橙汁。 他喝了一些紫色的果汁。 约翰·史密斯喝了一些苹果汁。 然后约翰·史密斯向简·史密斯问好。 约翰·史密斯的妻子向罗伯特·鲍尔森致意。 罗伯特·鲍尔森向两人致意。
<? php(电话)
$string($string) = “字符串” ;
回声 “索引-2处的字符是 $string($string) [- 2 ] ” , PHP_终止 ;
$字符串 [- 三 ] = “o” ;
回声 “将索引-3处的字符更改为o表示 $string($string) ” , PHP_终止 ;
?>
索引-2处的字符为n。 将索引-3处的字符更改为o会产生很强的效果。
<? php(电话)
//显示所有错误
错误_报告 ( 全部(_ALL) );
$很棒 = “太棒了” ;
//无法工作,输出:这太棒了
回声 “这是{ $很棒 }" ;
//作品、成果:太棒了
回声 “这是 { $很棒 } " ;
//工程
回声 “这个方块是 { $平方 -> 宽度 } 00厘米宽。 " ;
//有效,带引号的键只能使用花括号语法
回声 “这起作用: { $arr(美元) [ “密钥” ]} " ;
//工程
回声 “这起作用: { $arr(美元) [ 4 ][ 三 ]} " ;
//这是错误的,原因与$foo[bar]在字符串外是错误的相同。
//PHP首先查找一个名为foo的常量,如果没有找到,就会抛出一个错误。
//如果找到常量,则将使用其值(而不是“foo”本身)
//用于数组索引。
回声 “这是错误的: { $arr(美元) [ foo公司 ][ 三 ]} " ;
//工程。 使用多维数组时,始终在数组周围使用大括号
//在字符串内部时
回声 “这起作用: { $arr(美元) [ “foo” ][ 三 ]} " ;
//工程。
回声 “这很有效:” . $arr(美元) [ “foo” ][ 三 ];
回声 “这也很有效: { $对象 -> 值 [ 三 ]-> 名称 } " ;
回声 “这是名为 $名称 : {${ $名称 }} " ;
回声 “这是由getName()的返回值命名的变量的值: {${ 获取名称 ()}} " ;
回声 “这是由\$object->getName()的返回值命名的var的值: {${ $对象 -> 获取名称 ()}} " ;
//无法工作,输出:这是getName()的返回值:{getName(()}
回声 “这是getName()的返回值:{getName()}” ;
//无法工作,输出:C:\folder\{monastic}.txt
回声 “C:\文件夹\{ $很棒 }.txt“
//工作,输出:C:\folder\familtic.txt
回声 “C:\\文件夹\\ { $太棒了 } .txt“
?>
<? php(电话)
班 foo公司 {
无功功率,无功功率 $巴 = “我是酒吧。” ;
}
$foo美元 =新 foo公司 ();
$巴 = “bar” ;
美元baz =数组( “foo” , “bar” , “呸” , “quux” );
回声 " { $foo美元 -> $巴 } \n“ ;
回声 " { $foo美元 ->{ 美元baz [ 1 ]}} \n“ ;
?>
我是酒吧。 我是酒吧。
注释 :
从函数、方法调用、静态类变量、, 和内部的类常量
{$} 将被解释为名称 定义字符串的范围内的变量。 使用 单花括号(
{} )不适用于 访问函数或方法的返回值或 类常量或静态类变量的值。
<? php(电话)
//显示所有错误。
错误_报告 ( 全部(_ALL) );
班 啤酒 {
常量 软饮料 = “根啤酒” ;
公共静电 美元ale = 'ipa' ;
}
$根啤酒 = “A&W” ;
$ipa(美元) = “亚历山大·基思” ;
//这是有效的; 输出:我想要一个A&W
回声 “我想要一个 {${ 啤酒 :: 软饮料 }} \n“ ;
//这也行得通; 输出:我想要亚历山大·基思的
回声 “我想要一个 {${ 啤酒 :: 美元ale }} \n“ ;
?>
注释 : 从PHP 7.1.0开始,也支持负字符串偏移。 这些规定 距字符串末尾的偏移量。 以前,发射的负偏移
E_通知 用于阅读 (生成空字符串)和
E_警告 用于写作 (不动绳子)。
注释 : 在PHP 8.0.0之前, 一串 也可以使用大括号访问s,如 $str{42} ,目的相同。 从PHP 7.4.0开始,此花括号语法已被弃用,从PHP 8.0.0开始不再受支持。
注释 : 从PHP7.1.0开始,对空字符串应用空索引操作符会引发致命错误 错误。 以前,空字符串被静默转换为数组。
<? php(电话)
//获取字符串的第一个字符
$str(美元) = “这是一个测试。” ;
$优先 = $str(美元) [ 0 ];
//获取字符串的第三个字符
三分之一美元 = $str(美元) [ 2 ];
//获取字符串的最后一个字符。
$str(美元) = “这仍然是一个测试。” ;
上次$ = $str(美元) [ 斯特伦 ( $str(美元) )- 1 ];
//修改字符串的最后一个字符
美元str = “看看大海” ;
$str(美元) [ 斯特伦 ( $str(美元) )- 1 ] = “e” ;
?>
<? php(电话)
$str(美元) = “abc” ;
变量转储 ( $str(美元) [ '1' ]);
变量转储 (发行( $str(美元) [ '1' ]));
变量转储 ( $str(美元) [ '1.0' ]);
变量转储 (发行( $str(美元) [ '1.0' ]));
变量转储 ( $str(美元) [ “x” ]);
变量转储 (发行( $str(美元) [ “x” ]));
变量转储 ( $str(美元) [ “1x” ]);
变量转储 (发行( $str(美元) [ “1x” ]));
?>
字符串(1)“b” 布尔(true) 警告:第7行/tmp/t.php中的字符串偏移量“1.0”非法 字符串(1)“b” 布尔(假) 警告:第9行/tmp/t.php中的字符串偏移量“x”非法 字符串(1)“a” bool(错误) 字符串(1)“b” 布尔(假)
注释 :
访问其他类型的变量(不包括数组或对象 实现适当的接口)使用
[] 或
{} 无声地返回
无效的 .
注释 :
可以访问字符串文字中的字符 使用
[] 或
{} .
注释 :
使用
{} PHP 7.4中的语法已被弃用。 PHP 8.0中已删除此项。
注释 :
从PHP 8.0.0开始,小数点字符始终为 一个句点(“
. “)。在PHP 8.0.0之前, 小数点字符在脚本的语言环境中定义(类别 LC_NUMERIC)。 请参阅 setlocale() 功能。
u个
文档中没有提到,但heredoc末尾的结束分号实际上被解释为真正的分号,因此,有时会导致语法错误。
这项工作:
<? php(电话)
$foo美元 =<<<结束
美国广播公司
结束;
?>
这不会:
<? php(电话)
foo公司 (<<<END
美国广播公司
结束;
);
//语法错误,意外的“;”
?>
如果没有分号,则工作正常:
<? php(电话)
foo公司 (<<<END
美国广播公司
结束
);
?>
在PHP 8.2中,不推荐在字符串中使用${var},请改用{$var}:
<? php(电话)
$果汁 = “苹果” ;
//有效。 通过将变量名括在大括号中,显式指定变量名的末尾:
回声 “他喝了一些果汁 { $果汁 } s.“ ;
?>
您可以使用复杂语法将对象属性和对象方法的值放在字符串中。例如。。。
<? php(电话)
班 测试 {
公众的 一美元 = 1 ;
公共职能 二 () {
返回 2 ;
}
}
$测试 =新 测试 ();
回声 “”foo“ { $测试 -> 一 } 酒吧 { $测试 -> 二 ()} " ;
?>
将输出“foo 1 bar 2”。
但是,不能对命名空间中的所有值都这样做。 类常量和静态属性/方法将不起作用,因为复杂语法会查找“$”。
<? php(电话)
班 测试 {
常量 一个 = 1 ;
}
回声 “foo{Test::ONE}栏” ;
?>
这将输出“foo{Test::one}bar”。 常量和静态属性要求您分解字符串。
md5('240610708')==md5(‘QNKCDZO')
这种比较是正确的,因为md5()散列都以“0e”开头,所以PHP类型杂耍将这些字符串理解为科学符号。 根据定义,零升到任何幂都是零。
使用heredoc格式常数的简单透明解决方案:
定义(“测试”、“测试字符串”);
$const=获取_defined_constants();
回波<<<结束
{$const[“测试”]}
结束;
结果:
测试字符串
一个简单的函数,用于创建可读的转义双引号字符串,以便在源代码中使用或调试带有换行符/制表符等的字符串时使用。
<? php(电话)
功能 双引号 ( $str(美元) ) {
$ret(美元) = '"' ;
的( 1美元 = 0 , 1美元 = 斯特伦 ( $str(美元) ); 1美元 < 1美元 ; ++ 1美元 ) {
0美元 = 字 ( $str(美元) [ 1美元 ]);
如果( 美元 < 31 || 0美元 > 126 ) {
交换机( 0美元 ) {
案例 9 : $ret(美元) .= “\t” ; 断裂;
案例 10 : $ret(美元) .= '\n' ; 断裂;
案例 11 : $ret(美元) .= “\v” ; 断裂;
案例 12 : $ret(美元) .= “\f” ; 断裂;
案例 13 : $ret美元 .= “\r” ; 断裂;
违约: $ret(美元) .= “\x” . 字符串pad ( 十进制 ( 0美元 ), 2 , '0' , STR_PAD_左侧 );
}
}其他{
交换机( 0美元 ) {
案例 36 : $ret(美元) .= '\$' ; 断裂;
案例 34 : $ret(美元) .= '\"' ; 断裂;
案例 92 : $ret(美元) .= '\\\\' ; 断裂;
违约: $ret(美元) .= $str(美元) [ 1美元 ];
}
}
}
返回 $ret(美元) . '"' ;
}
?>
字符串中的前导零(至少令人惊讶)不被视为八进制。
考虑:
$x=“0123”+0;
$y=0123+0;
echo“x是$x,y是$y”// 打印“x是123,y是83”
换句话说:
*源代码中数字文字中的前导零被解释为“八进制”,c.f.strtol()。
*字符串(例如用户提交的数据)中的前导零,在将(隐式或显式)转换为整数时被忽略,并被视为十进制,即c.f.strtod()。
下面是一个可能与通过字符串末尾以外的字符访问字符串的奇怪性有关的问题:
$string=“a”;
var_dump($string[2]);// 字符串(0)“”
var_dump($string[7]);// 字符串(0)“”
$string[7]===“”;// 真的
似乎任何超过字符串末尾的内容都会给出一个空字符串。。然而,当E_NOTICE打开时,上述示例将抛出消息:
注意:行line上FILE中未初始化的字符串偏移量:N
无法使用@$string[7]专门屏蔽此消息,因为$string本身未设置时可能会出现这种情况。
isset($string[7]);// 错误的
$string[7]===NULL;// 错误的
尽管它看起来像是字符串类型的not-NULL值,但它仍然被认为是未设置的。
字符串转换为数字。
不幸的是,文档不正确。
«该值由字符串的初始部分给出。如果字符串以有效数字数据开头,则将使用该值。 否则,该值将为0(零)。 »
文档中的示例中没有提到,也没有显示,在将字符串转换为数字时,前导空格字符会被忽略,就像strtod函数一样。
<? php(电话)
回声 “\v\f\r 1234” + 1 ; // 1235
变量导出(_E) ( “\v\f\r 1234” == "1234" ); //真的
?>
然而,PHP的行为甚至与strtod的不同。文档中说,如果字符串包含“e”或“e”字符,它将被解析为浮点,并建议查看strtod的手册以了解更多信息。 手册上说
«十六进制数由“0x”或“0x”后跟可能包含基数字符的十六进制数字的非空序列组成,可以选择后跟二进制指数。 二进制指数由“P”或“P”组成,后跟可选的加号或减号,后跟非空的十进制数字序列,表示乘以2的幂。»
但PHP似乎无法识别指数或基数字符。
<? php(电话)
回声 “0xEp4” + 1 ; // 15
?>
strtod也使用当前区域设置来选择基数字符,但PHP忽略区域设置,并且基数字符始终为2E。 然而,PHP在将数字转换为字符串时使用区域设置。
对于strtod,当前的语言环境还用于选择空格字符,我不知道PHP。
<? php(电话)
\ \示例 #10简单语法-最后一行“echo”的解决方案。
班 人 {
公众的 $约翰 = “约翰·史密斯” ;
公众的 $简 = “简·史密斯” ;
公众的 $罗伯特 = “罗伯特·鲍尔森” ;
公众的 $史密斯 = “史密斯” ;
}
$人 =新 人 ();
回声 " $人 -> 厕所 然后向问好 $人 -> 简 ” . PHP_终止 ;
回声 " $人 -> 厕所 的妻子打招呼 $人 -> 罗伯特 ” . PHP_终止 ;
回声 " $人 -> 罗伯特 向这两个人打招呼 $人 -> 史密斯 " ;
\ \获胜 不起作用
\\输出:罗伯特·鲍尔森(Robert Paulsen)向两人致意
/**解决方案:**\
echo“$people->robert问候了两个$people->smith\x08s”;
\\会有用的
\\输出:罗伯特·鲍尔森向两位史密斯夫妇致意
?>
为了省心,请不要阅读之前关于日期的评论;)
当两个字符串都可以转换为数字时(在(“$a”>“$b”)测试中),则使用结果数字,否则将逐个字符比较FULL字符串:
<? php(电话)
变量转储 ( “1.22” > '01.23' ); //布尔(假)
变量转储 ( '1.22.00' > '01.23.00' ); //布尔(true)
变量转储 ( '1-22-00' > '01-23-00' ); //布尔(true)
变量转储 ((浮动) '1.22.00' >(浮动) '01.23.00' ); //布尔(假)
?>
下面是一个简单的技巧,允许双引号字符串和heredocs在花括号语法中包含任意表达式,包括常量和其他函数调用:
<? php(电话)
//黑客声明
功能 _快递 ( $v(美元) ){返回 $v(美元) ; }
导出(_E) = '导出(_E)' ;
//我们的游乐场
定义 ( “qwe” , “asd” );
定义 ( “zxc” , 5 );
美元 = 三 ;
十亿美元 = 4 ;
功能 c(c) ( 美元 , 十亿美元 ){返回 美元 + 十亿美元 ; }
//用法
回声 “前 { 导出(_E) ( 1 + 2 )} 发布\n“ ; //输出“前3后”
回声 “前 { 导出(_E) ( 量子阱 )} 发布\n“ ; //输出“pre-asd-post”
回声 “前 { 导出(_E) ( c(c) ( 美元 , 十亿美元 )+ zxc公司 * 2 )} 发布\n“ ; //输出“pre-17 post”
//一般语法是{$_expr(…)}
?>