$的本质

来源:互联网 发布:线切割怎么编程 编辑:程序博客网 时间:2024/06/02 15:16

接触过PHP的人都知道它的语法有一个非常鲜明的与众不同之处,就是每个变量的标识符必须以$开头。但是很多初学者或没有使用过PHP的人只把它当成php语言一种强行书写风格约定,甚至有人认为此是PHP的缺点因为限制了程序员书写变量名的自由。但是$的作用并不是仅仅让人类体验到书写风格,一眼看上去就知道那些标识符是变量那些不是,更重要的是让PHP的解释器知道某个标识符是否为变量。

“笑话,难道没有$解释器就不知道它是否为变量,其它语言的解释器或编译器怎么做到的?”先别笑看了以下代码再说。

例1
$varname="varhello";
$varhello="hello world";

echo $varnme;

echo $$varname;

例2
function fun()
      {
           echo "this is a function";

}

$funname="fun";

$funname(); //运行fun函数,输出 this is a function;

例3
class A
       {
             var $attr1;
             var $attr2;
            function A()
                 {
                     $this->attr1="hello ";
                     $this->attr2="world" ;
                }
            function print_me($atrname)
                {
                        $this->$atrname; //注意这->后应该是个对象属性标识符
                }

       }
$obja=new A();
$obja->print_me("attr1"); //输出hello
$obja->print_me("attr2"); //输出world

从以上三个例子可以看出,在PHP中的变量不仅仅存储的是数值,还可以以字符串的形式存储另一个变量的变量名,一个函数名,一个类实例(对象)的属性名。在这些什么什么名的标识符应该出现的地方如果出现了一个值为字串的变量,则解释器把这个变量所存储的值理解为这些标识符的名字。如例1中,执行到echo $$varname;时因为第一个$,解释器就知道后面应该出现是一个变量名(不包含$部分),但遇到第二个$知道这又是一个变量,就把这个变量$varname的值“varhello”解释为变量名,$$varname也就成了$varhello。第二个例子中执行到$funname(); 时遇到了()就知道$funname应该是个函数名,但$funname的开头是$,解释器知道这是个变量名而非函数名,于是就把$funname的值解释为函数名。类似,第三例也是如此。

大家应该能理解了,因为PHP的发明者为了实现PHP灵活的动态特性,让在PHP中的变量不仅仅存储的是数值,还可以以字符串的形式存储某些标识符,所以解释器在某些地方必须要区分一个符号本身就是这个标识符还是存储这个标识符名的变量标识符号。唯一的办法是要给其做个记号也就是$.

最后要提到的,这样做还产生了一个有益的副产品。
$value="world";
echo "hello $value";//输出hello world,在字符串中,$让解释器把$以及其后的字串尽可能理解为一个字符串变量以其值进行置换。当然这是个副产品,即使不要求变量名前加$,加任何其他转意符也可以这样做。只是既然已经有了在变量名前加$的要求,这样看起来更自然。