php5 全部都能运行.
唯一区别的是 第三个输出是red!
A banana is yellow.A banana is yellow.A banana is red.A banana is yellow.主要是考查数组索引.
如果没有定义define('banana','strawberry');常量, $fruits[banana]输出yellow, 但其实这种写法是不正确的.
因为除了数字索引之外, 字符串索引应该加引号$fruits['banana'].
手册上讲,如果字符串索引不加引号会出现不可预期的错误,呵呵.

解决方案 »

  1.   

    正常情况下 
    $fruits[banana]应该输出 red,这应该是最期望的结果.至于出现不同的输出,与php的编译有关系,呵呵,得好好学学编译原理了.
      

  2.   

    如果使用了一个未定义的常量,PHP 假定想要的是该常量本身的名字,如同用字符串调用它一样(CONSTANT 对应 "CONSTANT")。此时将发出一个 E_NOTICE 级的错误。为什么 $foo[bar] 错了?
    应该始终在用字符串表示的数组索引上加上引号。例如用 $foo['bar'] 而不是 $foo[bar]。但是为什么 $foo[bar] 错了呢?可能在老的脚本中见过如下语法:<?php
    $foo[bar] = 'enemy';
    echo $foo[bar];
    // etc
    ?>这样是错的,但可以正常运行。那么为什么错了呢?原因是此代码中有一个未定义的常量(bar)而不是字符串('bar'-注意引号),而 PHP 可能会在以后定义此常量,不幸的是你的代码中有同样的名字。它能运行,是因为 PHP 自动将裸字符串(没有引号的字符串且不对应于任何已知符号)转换成一个其值为该裸字符串的正常字符串。例如,如果没有常量定义为 bar,PHP 将把它替代为 'bar' 并使用之。 
      

  3.   

    看来PHP没有定义的变量本身就代表一个字符串
    define('banana','strawberry');
    echo '</br>banana: ' .banana . '</br>';
    echo '</br>banana:'."banana". '</br>';
    echo '</br>$banana:'.$banana. '</br>';
      

  4.   

    这涉及到三个问题,我所能看到的:
    1PHP常量
     常量不加引号,不加引号的PHP会认为它是常量.
      手册上讲得很清楚,如果你使用未定义的常量,会产生一个E_NOTICE的错误,然后会将它当本身当做一个字符串来处理.
     echo bar; 会输出bar
    2 数组
      以字符串为索引的数组,手册上要求必须加上引号.否则会有E_NOTICE错误.
     但是当出现在一个字符串的内部的时候,常量是不会被寻找的,所以就没有E_NOTICE级的错误,所以语法上是正确的.
     echo "A banana is $fruits[banana]." //output "yellow"; 语法上是正确的,但是通常我们不用这样的写法,因为这不常归的写法.
      echo "A banana is " . $fruits['banana'] . ".";或者echo sprintf("A banana is %s.", $fruits['banana']);
     
    3 {}号的作用
     echo "A banana is {$fruits[banana]}."; 这种情况和 echo $fruits[banana];是一样的.因为{}决定了PHP会把banana当作常量来寻找.当然你可以理解为{}里的会被先执行.我觉得已经说的很清楚了,实在不明白,也没有办法了,自己找个中文手册看吧.