文档中没有提到,但heredoc末尾的结束分号实际上被解释为真正的分号,因此,有时会导致语法错误。
这项工作:
<?php
$foo美元 =<<<结束
美国广播公司
结束;
?>
这不会:
<?php
foo公司 (<<<结束
美国广播公司
结束;
);
//语法错误,意外的“;”
?>
如果没有分号,则工作正常:
<?php
foo公司 (<<<结束
美国广播公司
结束
);
?>
注释 : 在32位版本中 一串 最大可达2GB (最多2147483647字节)
<?php
回声 '这是一个简单字符串' , PHP_终止 ;
回声 '您也可以在中嵌入换行符
按原样串
可以这样做' , PHP_终止 ;
//输出:阿诺德曾经说过:“我会回来的”
回声 阿诺德曾经说过:“我会回来的” , PHP_终止 ;
//输出:您删除了C:\*。 *?
回声 '您删除了C:\\*。 *?' , PHP_终止 ;
//输出:您删除了C:\*。 *?
回声 '您删除了C:\*。 *?' , PHP_终止 ;
//输出:这不会展开:\n换行
回声 '这不会展开:\n换行' , PHP语言 ;
//输出:变量也不$expand$
回声 '变量也不$expand$' , PHP_终止 ;
?>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<?php
//无压痕
回波<<<结束
一
b
c(c)
\n个
结束;
//4格压痕
回波<<<结束
一
b
c(c)
结束;
一 b c(c) 一 b c(c)
<?php
回波<<<结束
一
b
c(c)
结束;
分析错误:第4行example.php中的正文缩进级别无效(要求缩进级别至少为3)
<?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” ];
分析错误:语法错误,意外标识符“ING”,第5行example.php中应为“]”
<?php
班 foo公司 {
公众的 $巴 =<<<EOT
酒吧
EOT;
}
//标识符不能缩进
?>
<?php
班 foo公司 {
公众的 $巴 =<<<EOT
酒吧
EOT;
}
?>
<?php
$str(美元) =<<<爆炸物处理
字符串示例
跨越多条线
使用heredoc语法。
爆炸物处理;
/*更复杂的例子,有变量。 */
班 foo公司
{
无功功率,无功功率 $foo美元 ;
无功功率,无功功率 $巴 ;
功能 __构造 ()
{
$这个 -> foo公司 = “Foo” ;
$这个 -> 酒吧 =数组( '酒吧1' , “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” , '酒吧2' , “Bar3” );
}
}
$foo美元 =新 foo公司 ();
$名称 = “我的名字” ;
echo<<<“EOT”
我的名字是“$name”。 我正在打印一些$foo->foo。
现在,我正在打印一些{$foo->bar[1]。
这不应打印大写字母“a”:\x41
EOT;
?>
我的名字是“$name”。 我正在打印一些$foo->foo。 现在,我正在打印一些{$foo->bar[1]。 这不应打印大写字母“a”:\x41
<?php
班 foo公司 {
公众的 $bar(美元) =<<<“EOT”
酒吧
EOT;
}
?>
<?php
$果汁 = “苹果” ;
回声 “他喝了一些 $果汁 果汁。 " . PHP_终止 ;
?>
他喝了一些苹果汁。
字符串变量:: 可变名称(偏移或属性)? |${表达式} 偏移或属性: 字符串中的偏移 |存储中的属性 静态偏移:: [姓名] |[变量名称] |[整体-横向] 存储中的属性: ->姓名 变量名称:: $名称 姓名:: [a-zA-Z_\x80-\xff]*
<?php
常数 foo公司 = “bar” ;
$foo美元 = “foo” ;
$bar(美元) = “bar” ;
变量转储 ( " ${ foo公司 } " );
变量转储 ( " ${( foo公司 )} " );
?>
不推荐:不推荐在字符串中使用${var},请在文件的第6行使用{$var} 不推荐:不推荐在字符串中使用${expr}(变量),请在文件的第9行使用{${expr}} 字符串(3)“foo” 字符串(3)“bar”
字符串(3)“foo” 字符串(3)“bar”
注释 : 如果无法形成有效名称,美元符号将保留 作为字符串中的逐字:
<?php 回声 “没有发生插值$\n” ; 回声 “没有发生插值$\n” ; 回声 “没有发生插值$2\n” ; ?>
上述示例将输出: 没有发生插值$ 无插值$ 已经发生了 没有发生插值$2
<?php
$果汁 =数组( “苹果” , “橙色” , “字符串键” => “紫色” );
回声 “他喝了一些 $果汁 [ 0 ] 果汁。 " ;
回声 PHP语言 ;
回声 “他喝了一些 $果汁 [ 1 ] 果汁。 " ;
回声 PHP_终止 ;
回声 “他喝了一些 $果汁 [ 字符串键 ] 果汁。 " ;
回声 PHP_终止 ;
班 A类 {
公众的 %s美元 = “字符串” ;
}
0美元 =新 A类 ();
回声 “对象值: 0美元 -> 秒 ." ;
?>
他喝了一些苹果汁。 他喝了一些橙汁。 他喝了一些紫色的果汁。 对象值:字符串。
注释 : 数组键必须未加引号,因此无法 使用基本语法将常量作为键。 使用 先进的 而不是语法。
<?php
$string($string) = “字符串” ;
回声 “索引-2处的字符是 $string($string) [- 2 ] ." , PHP_终止 ;
$string($string) [- 三 ] = “o” ;
回声 “将索引-3处的字符更改为o表示 $string($string) ." , PHP_终止 ;
?>
索引-2处的字符为n。 将索引-3处的字符更改为o会产生很强的效果。
<?php
常数 数据_键 = '常量键' ;
$很棒 = “太棒了” ;
$arr(美元) = [
'1' ,
'2' ,
'3' ,
[ 41 , 42 , 43 ],
“密钥” => '索引值' ,
'常量键' => '带减号的键' ,
“foo”(foo) => [ “foo1” , “foo2” , “foo3” ]
];
//无法工作,输出:这太棒了
回声 “这是{ $很棒 }" ;
//作品、成果:太棒了
回声 “这是 { $很棒 } " ;
班 方形 {
公众的 $宽度 ;
公共职能 __构造 ( int$宽度 ) { $这个 -> 宽度 = $宽度 ; }
}
$平方 =新 方形 ( 5 );
//工程
回声 “这个方块是 { $平方 -> 宽度 } 00厘米宽。 " ;
//有效,带引号的键只能使用花括号语法
回声 “这起作用: { $arr(美元) [ “密钥” ]} " ;
//工程
回声 “这起作用: { $arr(美元) [ 三 ][ 2 ]} " ;
回声 “这起作用: { $arr(美元) [ 数据_键 ]} " ;
//使用多维数组时,始终在数组周围使用大括号
//当在字符串内部时
回声 “这起作用: { $arr(美元) [ “foo” ][ 2 ]} " ;
回声 “这起作用: { $对象 -> 值 [ 三 ]-> 名称 } " ;
回声 “这起作用: { $对象 -> $静态属性 } " ;
//无法工作,输出:C:\directory\{monastic}.txt
回声 “C:\目录\{ $很棒 }.txt“ ;
//工作,输出:C:\directory\familtic.txt
回声 “C:\\目录\\ { $很棒 } .txt“ ;
?>
注释 : 由于此语法允许使用任意表达式,因此可以使用 可变变量 在高级语法中。
注释 : 从PHP7.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” ;
变量转储 ( $str(美元) );
?>
<?php
$str(美元) = “abc” ;
$个密钥 = [ '1' , '1.0' , “x” , “1x” ];
前臂( $个密钥 作为 $keyToTry($keyTo尝试) ) {
变量转储 (发行( $str(美元) [ $keyToTry($keyTo尝试) ]));
尝试{
变量转储 ( $str(美元) [ $keyToTry($keyTo尝试) ]);
}捕捉( 类型错误$e ) {
回声 美元 -> 获取消息 (), PHP_终止 ;
}
回声 PHP_终止 ;
}
?>
布尔(true) 字符串(1)“b” 布尔(假) 无法访问字符串上字符串类型的偏移量 布尔(假) 无法访问字符串上字符串类型的偏移量 布尔(假) 警告:第10行标准输入代码中的字符串偏移量“1x”非法 字符串(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公司 (<<<结束
美国广播公司
结束;
);
//语法错误,意外的“;”
?>
如果没有分号,则工作正常:
<?php
foo公司 (<<<结束
美国广播公司
结束
);
?>
在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
\ \示例 #10简单语法-最后一行“echo”的解决方案。
班 人 {
公众的 $约翰 = “约翰·史密斯” ;
公众的 $简 = “简·史密斯” ;
公众的 $罗伯特 = “罗伯特·鲍尔森” ;
公众的 $史密斯 = “史密斯” ;
}
$人 =新 人 ();
回声 " $人 -> 厕所 然后向问好 $人 -> 简 ." . PHP_终止 ;
回声 " $人 -> 厕所 的妻子打招呼 $人 -> 罗伯特 ." . PHP_终止 ;
回声 " $人 -> 罗伯特 向这两个人打招呼 $人 -> 史密斯 " ;
\ \赢得 不起作用
\\输出:罗伯特·保尔森向两人致意
/**解决方案:**\
echo“$people->robert问候了两个$people->smith\x08s”;
\\会有用的
\\输出:罗伯特·鲍尔森向两位史密斯夫妇致意
?>
下面是一个可能与通过字符串末尾以外的字符访问字符串的奇怪性有关的问题:
$string=“a”;
var_dump($string[2]); //string(0)“”
var_dump($string[7]); //string(0)“”
$string[7]===“”; //正确
似乎任何超过字符串末尾的内容都会给出一个空字符串。。然而,当E_NOTICE打开时,上述示例将抛出消息:
注意:行line上FILE中未初始化的字符串偏移量:N
无法使用@$string[7]专门屏蔽此消息,因为$string本身未设置时可能会出现这种情况。
isset($string[7]); //错误
$string[7]===空; //错误
尽管它看起来像是字符串类型的not-NULL值,但它仍然被认为是未设置的。
字符串中的前导零(至少令人惊讶)不被视为八进制。
考虑:
$x=“0123”+0;
美元=0123+0;
echo“x是$x,y是$y”; //打印“x是123,y是83”
换句话说:
*源代码中数字文字中的前导零被解释为“八进制”,c.f.strtol()。
*字符串(例如用户提交的数据)中的前导零,在将(隐式或显式)转换为整数时被忽略,并被视为十进制,即c.f.strtod()。
创建人工可读转义双引号字符串的简单函数,用于源代码或使用换行符/tabs/等调试字符串。
<?php
功能 双引号 ( $str(美元) ) {
$ret(美元) = '"' ;
的( 1美元 = 0 , 1美元 = 斯特伦 ( $str(美元) ); 1美元 < 1美元 ; ++ 1美元 ) {
0美元 = 字 ( $str(美元) [ 1美元 ]);
如果( 0美元 < 31 || 0美元 > 126 ) {
交换机( 0美元 ) {
案例 9 : $ret(美元) .= “\t” ;中断;
案例 10 : $ret(美元) .= “\n” ;中断;
案例 11 : $ret(美元) .= “\v” ;中断;
案例 12 : $ret(美元) .= “\f” ;中断;
案例 13 : $ret(美元) .= “\r” ;中断;
违约: $ret(美元) .= “\x” . 字符串pad ( 十进制 ( 美元 ), 2 , '0' , STR_PAD_左侧 );
}
}其他{
交换机( 0美元 ) {
案例 36 : $ret(美元) .= '\$' ;中断;
案例 34 : $ret(美元) .= '\"' ;中断;
案例 92 : $ret(美元) .= '\\\\' ;中断;
违约: $ret(美元) .= $str(美元) [ 1美元 ];
}
}
}
返回 $ret(美元) . '"' ;
}
?>
为了省心,请不要阅读之前关于日期的评论;)
当两个字符串都可以转换为数字时(在(“$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(…)}
?>