A类一串是一系列字符,其中字符是与字节相同。这意味着PHP只支持256个字符集,因此不提供本机Unicode支持。请参见字符串的详细信息类型.

注释:在32位版本中一串最大可达2GB(最多2147483647字节)

语法

A类一串文字可以用四种不同的方式指定:

单引号

指定一串是把它装在一个盒子里引号(字符').

要指定单引号,请用反斜杠转义(\). 要指定文字反斜杠,请将其加倍(\\). 将处理所有其他反斜杠实例作为反斜杠:这意味着其他转义序列可能习惯于,例如\对\n个,将按规定逐字输出,而不是有任何特殊的含义。

注释:双引号赫代克语法,变量和转义序列对于特殊字符将当它们被扩展时出现在单引号中一串秒。

<?php(电话)
回声'这是一个简单字符串';

回声
'您还可以在中嵌入换行符
按原样串
可以这样做'
;

//输出:阿诺德曾经说过:“我会回来的”
回声阿诺德曾经说过:“我会回来的”;

//输出:您删除了C:\*.*?
回声'您删除了C:\\*.*?';

//输出:您删除了C:\*.*?
回声'您删除了C:\*.*?';

//输出:这不会展开:\n换行
回声'这不会展开:\n换行';

//输出:变量也不$expand$
回声'变量也不$expand$';
?>

双引号

如果一串用双引号(“)括起来,PHP将解释特殊字符的以下转义序列:

转义字符
顺序 含义
\n个 换行符(ASCII中的LF或0x0A(10))
\对 回车(CR或ASCII中的0x0D(13))
\t吨 水平选项卡(HT或ASCII中的0x09(9))
\v(v) 垂直选项卡(VT或ASCII中的0x0B(11))
\电子 转义(ASCII中的ESC或0x1B(27))
\(f) 换页(FF或ASCII中的0x0C(12))
\\ 反斜杠
\$ 美元符号
\" 双引号
\[0-7]{1,3} 八进制:与正则表达式匹配的字符序列[0-7]{1,3}是八进制表示法中的字符(例如。“\101”===“A”),它会自动溢出以容纳一个字节(例如。"\400" === "\000")
\x[0-9A-Fa-f]{1,2} 十六进制:与正则表达式匹配的字符序列[0-9A-Fa-f]{1,2}是十六进制表示法中的字符(例如。“\x41”===“A”)
\u{[0-9A-Fa-f]+} Unicode:与正则表达式匹配的字符序列[0-9A-传真]+是一个Unicode代码点,它将作为该代码点的UTF-8表示输出到字符串。序列中需要使用大括号。例如。“\u{41}”===“A”

如单引号所示一串s、 转义任何其他字符也会打印反斜杠。

双引号最重要的特点一串s是事实变量名将被展开。请参见字符串分析对于细节。

赫里多克

第三种划界方式一串s是heredoc语法:<<<。在此运算符之后,标识符为提供,然后换行。这个一串它自己跟着,然后再次使用相同的标识符来结束报价。

结束标识符可以用空格或制表符缩进,在这种情况下缩进将从文档字符串中的所有行中删除。在PHP 7.3.0之前,结束标识符必须从行的第一列开始。

此外,结束标识符必须遵循与任何PHP中的其他标签:它只能包含字母数字字符和下划线,并且必须以非数字字符或下划线开头。

示例#1 PHP 7.3.0中的Heredoc基本示例

<?php(电话)
//无压痕
回波<<<结束

b条
c(c)
\n个
结束;

//4格压痕
回波<<<结束

b条
c(c)
结束;

PHP 7.3中上述示例的输出:

b条c(c)b条c(c)

如果结束标识符缩进超过正文的任何行,则分析错误将抛出:

示例#2结束标识符的缩进不得超过正文的任何行

<?php(电话)
回波<<<结束

b条
c(c)
结束;

PHP 7.3中上述示例的输出:

PHP分析错误:第4行example.PHP中的正文缩进级别无效(要求缩进级别至少为3)

但是,如果结束标识符缩进,也可以使用制表符,制表符和空格不能混杂在一起结束标识符的缩进和正文的缩进(直至结束标识符)。在这些情况下分析错误将被抛出。由于混合了制表符和缩进空间对易读性有害。

示例#3正文(空格)结束标识符的不同缩进

<?php(电话)
//以下所有代码都不起作用。

//正文(空格)结束标记(制表符)的不同缩进
{
回波<<<结束

结束;
}

//混合车身中的空间和翼片
{
回波<<<结束

结束;
}

//在结束标记中混合空格和制表符
{
回波<<<结束

结束;
}

PHP 7.3中上述示例的输出:

PHP解析错误:缩进无效-example.PHP第8行中不能混合制表符和空格

正文字符串的结束标识符不需要后跟分号或换行符。例如,以下代码自PHP 7.3.0起允许:

示例#4在结束标识符后继续表达式

<?php(电话)
$值
=[<<<结束

b条
c(c)
结束,“d e f”];
变量转储($值);

PHP 7.3中上述示例的输出:

数组(2){[0] =>字符串(11)“ab条c“[1] =>字符串(5)“d e f”}
警告

如果结束标识符位于行的开头,则不管它是否是另一个单词的一部分,都可以考虑作为结束标识符,并导致分析错误.

示例#5字符串正文中的结束标识符往往会导致ParseError

<?php(电话)
$值
=[<<<结束

b条
结束惯性导航与制导
结束
,“d e f”];

PHP 7.3中上述示例的输出:

PHP解析错误:语法错误,意外标识符“ING”,example.PHP第6行应为“]”

为避免此问题,遵循以下简单规则是安全的:如果结束标识符出现在正文中,则不要选择它的文本.

警告

在PHP 7.3.0之前,需要注意的是结束标识符不能包含除分号以外的其他字符(;).这尤其意味着标识符不能缩进,并且可能没有任何空格或分号前后的制表符。认识到这一点也很重要结束标识符之前的第一个字符必须是换行符,如下所示由本地操作系统定义。这是\n个UNIX系统,包括macOS。结束分隔符也必须是后跟换行符。

如果这个规则被打破,并且结束标识符不是“干净的”,它将不被视为结束标识符,PHP将继续查找一个。如果在当前文件的最后一行将导致解析错误。

示例#6无效示例,PHP 7.3.0之前

<?php(电话)
foo公司{
公众的
$巴=<<<EOT
酒吧
EOT;
}
//标识符不能缩进
?>

示例#7有效示例,甚至在PHP 7.3.0之前

<?php(电话)
foo公司{
公众的
$巴=<<<EOT
酒吧
EOT;
}
?>

此处包含变量的文档不能用于初始化类属性。

Heredoc文本的行为就像双引号一串,没有双引号。这意味着heredoc中的引号不需要转义,但上面列出的转义代码仍然可以使用。变量包括展开,但在表达复杂变量时必须同样小心在heredoc内部一串秒。

示例#8 Heredoc字符串引用示例

<?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

也可以使用Heredoc语法将数据传递给函数论据:

示例#9参数示例中的Heredoc

<?php(电话)
变量转储
(阵列(<<<EOD
福巴!
地球观测站
));
?>

可以初始化静态变量和类使用Heredoc语法的属性/常量:

示例#10使用Heredoc初始化静态值

<?php(电话)
//静态变量
功能foo公司()
{
静止的
$巴=<<<标签
这里什么都没有。。。
标签;
}

//类属性/常量
foo公司
{
常量
酒吧=<<<FOOBAR(福巴尔)
常量示例
FOOBAR公司;

公众的
美元baz=<<<FOOBAR(福巴尔)
属性示例
FOOBAR公司;
}
?>

打开的Heredoc标识符可以是可选的用双引号括起来:

示例#11在Heredoc中使用双引号

<?php(电话)
echo<<<“FOOBAR”
你好,世界!
FOOBAR公司;
?>

诺多克

现在,heredocs对单引号字符串的作用就像heredocs对双引号字符串的影响一样串。指定nowdoc与指定heredoc类似,但解析已完成在nowdoc中。该结构非常适合于无需逃跑。它与SGML共享一些共同的功能<![CDATA[]]>构造,因为它声明了一个不用于分析的文本块。

nowdoc使用相同的<<<用于heredocs的序列,但后面的标识符包含在单引号,例如。<<<“EOT”。的所有规则heredoc标识符也适用于nowdoc标识符,尤其是那些关于结束标识符的外观。

示例#12 Nowdoc字符串引用示例

<?php(电话)
echo<<<“爆炸物处理”
跨越多条线的字符串示例
使用nowdoc语法。反斜杠总是按字面意思处理,
例如\\和\\'。
爆炸物处理;

上述示例将输出:

跨越多条线的字符串示例使用nowdoc语法。反斜杠总是按字面意思处理,例如\\和\\'。

示例#13 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

示例#14静态数据示例

<?php(电话)
foo公司{
公众的
$巴=<<<“EOT”
酒吧
EOT;
}
?>

变量解析

一串用双引号或heredoc指定,变量在其中进行解析。

有两种类型的语法:a简单的一个和一个复杂的一个。简单的语法是最常见、最方便的。它提供了一种嵌入变量阵列值,或对象中的属性一串用最少的努力。

复杂的语法可以通过围绕表达式的花括号。

语法简单

如果是美元符号($)遇到时,解析器将贪婪地使用尽可能多的标记来形成有效的变量名。将变量名括在花括号中,以显式指定名称。

<?php(电话)
$果汁
=“苹果”;

回声
“他喝了一些$果汁果汁。".PHP_终止;

//意外。“s”是变量名的有效字符,所以它指的是$juice,而不是$juice。
回声“他喝了一些果汁$果汁.PHP_终止;

//通过将引用括在大括号中,显式指定变量名的末尾。
回声“他喝了一些果汁{$果汁}秒。”;

?>

上述示例将输出:

他喝了一些苹果汁。他喝了一些果汁。他喝了一些苹果汁。

类似地阵列索引或对象财产可以进行分析。对于数组索引,右方括号(])标记索引的结尾。同样的规则适用于简单变量的对象属性。

示例#15简单语法示例

<?php(电话)
$果汁
=数组(“苹果”,“橙色”,“koolaid1”=>“紫色”);

回声
“他喝了一些$果汁[0]果汁。".PHP_终止;
回声
“他喝了一些$果汁[1]果汁。".PHP_终止;
回声
“他喝了一些$果汁[科奥莱德1]果汁。".PHP_终止;

{
公众的
$约翰=“约翰·史密斯”;
公众的
$简=“简·史密斯”;
公众的
$罗伯特=“罗伯特·鲍尔森”;

公众的
$史密斯=“史密斯”;
}

$人=新();

回声
"$人->厕所喝了一些$果汁[0]果汁。".PHP_终止;
回声
"$人->厕所然后向问好$人->.PHP_终止;
回声
"$人->厕所的妻子打招呼$人->罗伯特.PHP_终止;
回声
"$人->罗伯特向这两个人打招呼$人->史密斯;//行不通
?>

上述示例将输出:

他喝了一些苹果汁。他喝了一些橙汁。他喝了一些紫色的果汁。约翰·史密斯喝了一些苹果汁。然后约翰·史密斯向简·史密斯问好。约翰·史密斯的妻子向罗伯特·鲍尔森致意。罗伯特·鲍尔森向两人致意。

自PHP 7.1.0起消极的数字索引是支持。

示例#16负数字索引

<?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“;
?>

字符串访问和字符修改

中的字符一串s可以由访问和修改指定所需字符在一串使用正方形阵列括号,如$str[42].想想一串作为阵列用于此目的的字符数。功能substr()substr_replace()当要提取或替换多个字符时,可以使用。

注释:从PHP 7.1.0开始,也支持负字符串偏移。这些规定距字符串末尾的偏移量。以前,发射的负偏移E_通知用于阅读(生成空字符串)和E_警告用于写作(不动绳子)。

注释:在PHP 8.0.0之前,一串也可以使用大括号访问s,如$str{42},目的相同。从PHP 7.4.0开始,此花括号语法已被弃用,从PHP 8.0.0开始不再受支持。

警告

写入超出范围的偏移量会用空格填充字符串。非整数类型转换为整数。非法偏移类型发出E_警告.只使用指定字符串的第一个字符。从PHP7.1.0开始,分配空字符串会引发致命错误。从前,它分配了一个空字节。

警告

在内部,PHP字符串是字节数组。因此,访问或使用数组括号修改字符串不是多字节安全的,并且只能对以下单字节编码的字符串执行此操作按照ISO-8859-1。

注释:从PHP7.1.0开始,对空字符串应用空索引操作符会引发致命错误错误。以前,空字符串被静默转换为数组。

示例#17一些字符串示例

<?php(电话)
//获取字符串的第一个字符
$str(美元)=“这是一个测试。”;
$优先=$str(美元)[0];

//获取字符串的第三个字符
三分之一美元=$str(美元)[2];

//获取字符串的最后一个字符。
$str(美元)=“这仍然是一个测试。”;
上次$=$str(美元)[斯特伦($str(美元))-1];

//修改字符串的最后一个字符
美元str=“看看大海”;
$str(美元)[斯特伦($str(美元))-1] =“e”;

?>

字符串偏移必须是整数或类似整数的字符串,否则将引发警告。

示例#18非法字符串偏移示例

<?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中已删除此项。

有用的函数和运算符

字符串可以使用“.”连接(点)运算符。注释“+”(加法)运算符将为此努力。请参见字符串运算符对于更多信息。

有许多有用的函数用于一串操纵。

请参阅字符串函数部分对于一般功能,以及Perl-compatible正则表达式函数用于高级查找和替换功能。

还有URL字符串函数、和用于加密/解密字符串的函数(搞砸).

最后,请参见字符类型功能.

正在转换为字符串

值可以转换为一串使用(字符串)演员或strval()功能。字符串转换是在表达式,其中一串需要。使用回声打印函数,或当变量与一串。上的章节类型类型杂耍将使以下更清楚。另请参见设置类型()功能。

A类布尔 真的值转换为一串 "1".布尔 已转换为""(空字符串)。这允许转换回和第四方布尔一串值。

一个整数浮动转换为一串以文本形式表示数字(包括指数部分浮动s) ●●●●。浮点数可以是使用指数表示法转换(4.1东经+6).

注释:

从PHP 8.0.0开始,小数点字符始终为一个句点(“.“)。在PHP 8.0.0之前,小数点字符在脚本的语言环境中定义(类别LC_NUMERIC)。请参阅setlocale()功能。

阵列s始终转换为一串 “数组”; 因为这个,回声打印无法单独显示阵列。要查看单个图元,请使用诸如echo$arr['foo']。有关查看整个内容。

为了转换对象s至一串,魔法方法__toString(字符串)必须使用。

资源s始终转换为一串s与结构“资源id#1”,其中1是分配给资源由PHP在运行时。虽然不应依赖此字符串的确切结构并且可能会发生变化,对于给定的资源,它将始终是唯一的在执行脚本的生命周期内(即Web请求或CLI过程),并且不会被重用。要获得资源的类型,使用这个获取资源类型()功能。

无效的始终转换为空字符串。

如上所述,直接转换阵列,对象,或资源一串不提供有关超出其类型的值的任何有用信息。请参阅功能打印_()var_dump()对于更有效地检查这些类型的内容。

大多数PHP值也可以转换为一串s表示永久存储。此方法称为序列化,由序列化()功能。

字符串类型的详细信息

这个一串在PHP中实现为字节数组和指示缓冲区长度的整数。它没有关于如何这些字节转换为字符,将任务留给程序员。字符串可以包含的值没有限制;在里面特定的,带值的字节0允许使用(“NUL字节”)字符串中的任何位置(但是,本手册中提到的一些函数“二进制安全”,可以将字符串交给忽略数据的库在NUL字节之后。)

字符串类型的这种性质解释了为什么没有单独的“字节”类型在PHP中,字符串扮演这个角色。不返回文本数据的函数–for实例,从网络套接字读取的任意数据仍将返回串。

考虑到PHP没有规定字符串的特定编码,可以想知道字符串文字是如何编码的。例如,字符串"á"相当于“\xE1”(ISO-8859-1),“\xC3\xA1”(UTF-8、C格式),“\x61\xCC\x81”(UTF-8,D格式)或任何其他可能的代表性?答案是字符串将以任何方式编码它在脚本文件中编码。因此,如果脚本是用ISO-8859-1,字符串将在ISO-8859-1中编码,依此类推。但是,如果启用了Zend Multibyte,则这不适用;在这种情况下,脚本可以用任意编码(显式声明或检测到),然后转换为特定的内部编码,然后将用于字符串文字的编码。请注意,脚本的编码(或内部编码,如果启用Zend Multibyte)–这几乎总是表示此编码应该是ASCII的兼容超集,例如UTF-8或ISO-8859-1。然而,请注意,状态相关编码在初始和非初始移位状态中可以使用相同的字节值可能会有问题。

当然,为了有用,对文本进行操作的函数可能必须假设字符串是如何编码的。不幸的是,这里在PHP的函数中,这一点有很大变化:

  • 一些函数假设字符串是以某种(任何)单字节编码的编码,但不需要将这些字节解释为特定的字符。例如,substr(),strpos(),strlen()strcmp()。思考这些函数的另一种方式是操作内存缓冲区,即它们处理字节和字节偏移。
  • 其他函数传递字符串的编码,可能它们如果没有给出此类信息,则假定为默认值。这是一个案例htm实体()和大多数中的函数mbstring(mbstring)扩展。
  • 其他人使用当前语言环境(请参见setlocale()),但是逐字节操作。
  • 最后,他们可能只是假设字符串使用特定编码,通常为UTF-8。这是中大多数函数的情况国际贸易组织扩展和中PCRE公司延伸(在最后一种情况下,只有当u个使用修饰符)。

最终,这意味着使用Unicode编写正确的程序取决于小心避免不起作用且最有可能起作用的功能破坏数据并使用行为正确的函数,通常来自国际贸易组织mbstring(mbstring)扩展名。然而,使用可以处理Unicode编码的函数只是开始。无论语言提供什么功能,都必须了解Unicode规范。例如,假设存在只有大写和小写才是错误的假设。

添加注释

用户贡献的笔记12条注释

gmail dot com上的gtisza
12年前
文档中没有提到,但heredoc末尾的结束分号实际上被解释为真正的分号,因此,有时会导致语法错误。

这项工作:

<?php(电话)
$foo美元
=<<<结束
美国广播公司
结束;
?>

这不会:

<?php(电话)
foo公司
(<<<END
美国广播公司
结束;
);
//语法错误,意外的“;”
?>

如果没有分号,则工作正常:

<?php(电话)
foo公司
(<<<END
美国广播公司
结束
);
?>
巴赫曼MD
1年前
在PHP 8.2中,不推荐在字符串中使用${var},请改用{$var}:

<?php(电话)
$果汁
=“苹果”;

//有效。通过将变量名括在大括号中,显式指定变量名的末尾:
回声“他喝了一些果汁{$果汁}s.“;
?>
莱龙网的莱龙
19年前
您可以使用复杂语法将对象属性和对象方法的值放在字符串中。例如。。。
<?php(电话)
测试{
公众的
一美元=1;
公共职能
() {
返回
2;
}
}
$测试=新测试();
回声
“”foo“{$测试->}酒吧{$测试->()}";
?>
将输出“foo 1 bar 2”。

但是,不能对命名空间中的所有值都这样做。类常量和静态属性/方法将不起作用,因为复杂语法会查找“$”。
<?php(电话)
测试{
常量
一个=1;
}
回声
“foo{Test::ONE}栏”;
?>
这将输出“foo{Test::one}bar”。常量和静态属性要求您分解字符串。
雷。Paseur有时使用Gmail
5年前
md5('240610708')==md5(‘QNKCDZO')

这种比较是正确的,因为md5()散列都以“0e”开头,所以PHP类型杂耍将这些字符串理解为科学符号。根据定义,零升到任何幂都是零。
og at gams点at
17年前
使用heredoc格式常数的简单透明解决方案:
定义(“测试”、“测试字符串”);

$const=获取_defined_constants();

回波<<<结束
{$const[“测试”]}
结束;

结果:
测试字符串
史蒂夫在mrclay-dot org
15年前
一个简单的函数,用于创建可读的转义双引号字符串,以便在源代码中使用或调试带有换行符/制表符等的字符串时使用。

<?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(美元).'"';
}
?>
richardneill dot org的php
11年前
字符串中的前导零(至少令人惊讶)不被视为八进制。
考虑:
$x=“0123”+0;
$y=0123+0;
echo“x是$x,y是$y”//打印“x是123,y是83”
换句话说:
*源代码中数字文字中的前导零被解释为“八进制”,c.f.strtol()。
*字符串(例如用户提交的数据)中的前导零,在将(隐式或显式)转换为整数时被忽略,并被视为十进制,即c.f.strtod()。
chejz dot com的atnak
20年前
下面是一个可能与通过字符串末尾以外的字符访问字符串的奇怪性有关的问题:

$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值,但它仍然被认为是未设置的。
gmail dot com上的坏死尘埃44
10年前
字符串转换为数字。

不幸的是,文档不正确。

«该值由字符串的初始部分给出。如果字符串以有效数字数据开头,则将使用该值。否则,该值将为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。
gmail网站上的绿蓝月光
3年前
<?php(电话)
\\示例#10简单语法-最后一行“echo”的解决方案。

{
公众的
$约翰=“约翰·史密斯”;
公众的
$简=“简·史密斯”;
公众的
$罗伯特=“罗伯特·鲍尔森”;

公众的
$史密斯=“史密斯”;
}

$人=新();

回声
"$人->厕所然后向问好$人->.PHP_终止;
回声
"$人->厕所的妻子打招呼$人->罗伯特.PHP_终止;
回声
"$人->罗伯特向这两个人打招呼$人->史密斯";
\
\获胜不起作用
\\输出:罗伯特·鲍尔森(Robert Paulsen)向两人致意

/**解决方案:**\

echo“$people->robert问候了两个$people->smith\x08s”;

\\会有用的
\\输出:罗伯特·鲍尔森向两位史密斯夫妇致意

?>
如果点u点需要,则在findme点处的chAlx
15年前
为了省心,请不要阅读之前关于日期的评论;)

当两个字符串都可以转换为数字时(在(“$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');//布尔(假)
?>
海登在karelia dot ru
14年前
下面是一个简单的技巧,允许双引号字符串和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(…)}
?>
到顶部