日期:2011-07-22  浏览次数:20470 次


    灵活的字符串。
   因为$表达的灵活性,我们可以用“映射”的方法,调出字符串或者函数。
<?php
$a = 'b';
$b = '123';
echo $$a; // 这可以输出123。不过比较好的习惯是echo ${$a},这样更清楚明了。
$c = 'd';
echo $c();
function d() {return '321';} // $c()调用的是d函数
?>
    php的字符串和javascript和python类似,在单引号中不用把双引号写成\",在双引号中也不用转义单引号。但是,因为php中有有趣的$存在,所以双引号要复杂一些。看例子。
<?php
$aa = 'abc';
echo "'$aa'";
echo "\{$aa}"; // 这样写 PHP5.1.1以前后会显示不同的结果
echo "\\{{$aa}}"; // 这样写就没问题
?>
   双引号中可以有变量,可以用"$a"或"{$a}"形式来表现,个人建议大家多用后面的写法,第一编辑器会高亮,第二能写更复杂的式子。要注意,虽然"'{$a}'"的结果和"'".$a."'"的结果一样,但是{并非'"的简写,echo "'{__FILE__}'"和echo "'".__FILE__."'"结果是不同的。因为双引号中的封闭区间是以 {$ xxxx } 这种结构(或${xxxx}结构,不过这个和双引号外面的结构不一样,我不太喜欢)。所以可以写{$this->func()},不能写{self::func()},或{常量}。
<?php
function demo() {return 'abc';}
function abc() {return '123';}
$func = function() {return 'function';}; // 需要php5.3以上版本
$abc = 'abc';
$abc1 = 'abc--one::';
echo ${demo().'1'};
echo ${demo('}}')}();
echo "\{{${demo()}()}:::{$func()}\}{\$";
$test = 'Test';
echo ":::<br/>{$test::func()}:::";
class Test
{
static public function func()
{
return 'static func';
}
}
?>
   虽然php的双引号很强大,但很多场合并不太需要, 要生成页面,很多时候可以这样写:
$form .= '<input type="hidden" name="'.$name.'" value="'.form_prep($value, $name).'" />'."\n";
   这个是CI框架中form_helper.php的form_hidden的一行代码。
   要输出的单引号多时,用双引号括字符串。反之用单位引号。单引号和双引号相比,用来括字符串效率并不会高多少,虽然单引号只需要转义\\和\',双引号的有
SequenceMeaning
\n换行 (LF or 0x0A (10) in ASCII)
\r回车 (CR or 0x0D (13) in ASCII)
\t水平方向的 tab(HT or 0x09 (9) in ASCII)
\v竖直方向的 tab (VT or 0x0B (11) in ASCII) (since PHP 5.2.5)
\f换页 (FF or 0x0C (12) in ASCII) (since PHP 5.2.5)
\\反斜线
\$美金dollar标记
\"双引号
\[0-7]{1,3}符合该表达式顺序的字符串是一个八进制的字符
\x[0-9A-Fa-f]{1,2}符合该表达式顺序的字符串是一个十六进制的字符
   这么多要转义,但我想程序在遍历每一个字符时,实际上它最初只需要判断 \ " $ ,可能还有 {。 
那么双引号和单引号一样多时应该怎么输出呢?我们先看一下别的语言的解决方案。
Python 可以用 ''' 或者 """ 来闭合字符串,这之中并不需转义"和',有需要的话,可以写成这样  '''这样'''+"'''"。
因为php是一个模版语言,所以想直接输出的话(最好写大引用的模版文件里),直接写html就可以了。
不直接输出的话, php 用的是 heredoc语法结构和nowdoc(语法结构自PHP 5.3.0以后) 。
    Heredoc是以 <<<xxxx 开头, 以 xxxx; 结尾;Nowdoc,是以 <<<'xxxx' 开头, 以 xxxx;结尾。注意xxxx;结尾要在回车后且和回车语句之间不能有别的字符。
<?php
$a = 'abc';
$b = 'html';
$c = <<<html
'{$b}'
html;
$d = "'{$b}'
";
if ($c === $d)
{
echo <<<abc
\$c === \$d:::'{$a}' {$c}
abc<br/>
abc;
echo <<<'test'
\$c === \$d:::'{$a}' {$c}
'test'
test<br/>
test;
}
?>
   Javascript没有原生的方法,但是依靠html,还是可以解决问题。
   下面写个iframe异步提交的例子。
<?php
/* iframe_test.php */
if (isset($_POST['cmd']))
{
// 正规的写法是引用模版文件。
?>