双引号变量解析枚举

由于不理解,就一个劲的测试,得出以下结果:
一、标量变量解析
实例:

<?php
$a=5;
$b=5.5;
$c=true;
$d=false;
$e=null;
$f='Hello world!';
echo "$a $b $c $d $e $f";
echo "<br/>{$a} {$b} {$c} {$d} {$e} {$f}";
echo "<br/>${a} ${b} ${c} ${d} ${e} ${f}";
?>

二、数组单元解析
实例一:

<?php
$arr=['green','a'=>'blue'];
echo "$arr[0] $arr[a]";
echo "<br/>{$arr[0]} {$arr['a']}";
?>

实例二:

<?php
$arr=[['green','a'=>'blue'],'x'=>['green','a'=>'blue']];
echo "{$arr[0][0]} {$arr[0]['a']} {$arr['x'][0]} {$arr['x']['a']}";
?>

三、对象成员解析
实例一:

<?php
class A{
    var $test='red';
}
$obj = new A;
echo "$obj->test";
echo "<br/>{$obj->test}";
?>

实例二:

<?php
class A{
    var $test=['green','a'=>'blue'];
}
$obj = new A;
echo "{$obj->test[0]} {$obj->test['a']}";
?>

实例三:

<?php
class A{
    function test1(){return 'red';}
    function test2(){return ['green','a'=>'blue'];}
}
$obj = new A;
echo "{$obj->test1()} {$obj->test2()[0]} {$obj->test2()['a']}";
?>

像字符串中表示对象的成员常量、对象的静态成员,我都不会。
虽然测试了一些表示形式,但我根本就不理解,请指教

阅读 2.7k
2 个回答

我的理解:

1、双引号里解析php变量,加{}的目的是为了防止变量名字符串结合,避免产生变量不存在的错误,比如下面这段代码

<?php 

$a = 'aaa';
$b = 'bbb';

echo "$ac$b";

exit;

你原本想要输出的结果是aaacbbb;但是由于$ac中的变量$a和字符串c没有区分开,导致php解析变量的时候,会把$ac当做一个变量来进行处理;但是如果你加一个{}就完全把php变量字符串隔离开了,如下:

<?php 

$a = 'aaa';
$b = 'bbb';

echo "{$a}c{$b}";

exit;

这样的话,就能输出你想要的结果aaacbbb

2、代码里:echo "<br/>${a} ${b} ${c} ${d} ${e} ${f}"这样的方法容易产生代码的误读,因为这种写法并不常见而且没有意义。
测试过这种写法是可以,但是太过于混乱,我的理解:双引号中使用{}只是隔离php变量和字符串的作用,就自己的不见经传的理解,觉得,这样的做法可以让zend引擎在进行词法、语法分析的时候能够更快的知道{}里包裹的就是php变量,是需要解析的东西

3、在遇到变量要和字符串结合输出的场景,我一般都会把代码和字符串分隔开来,用.连接符来连接,如下面:

<?php 

$a = 'aaa';
$b = 'bbb';

echo $a . 'b' . $b;

exit;

4、你说的对象成员在双引号的输出也同上吧,你完全可以采用3里面的描述,把对象成员放在引号外面:

class A{
    var $test=['green','a'=>'blue'];
}
$obj = new A;
echo $obj->test[0] . ' ' . $obj->test['a'];

5、不要纠结于在字符串中输出对象成员这种问题,因为在实际工作中,这种写法并不多,而且对代码也并不友好,不容易排错,如果把变量(对象成员)和字符串(引号)分开写,会让代码更清晰易懂;

我自己的一点理解,希望能对你有帮助;

你的问题主要是 单双引号 区别问题。
建议上php官网php.net查看php手册

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题