PHP 是一门弱类型语言:
在上面的实例中,我们注意到,不必向 PHP 声明该变量的数据类型。(跟Javascript很像啊!)
PHP 会根据变量的值,自动把变量转换为正确的数据类型。
在强类型的编程语言中,我们必须在使用变量前先声明(定义)变量的类型和名称。(比如C语言)
PHP 变量作用域:
PHP 有四种不同的变量作用域:
- local(翻译---当地的;局部的;地方性的;乡土的)
- global(翻译---全球的;总体的;球形的)
- static(翻译---静态的;静电的;静力的)
- parameter(翻译---参数;系数;参量)
其实根据翻译就能大致的知道这几种作用域的范围了。看一个例子:
1 <?php 2 $x=5; // 全局变量 3 4 function myTest() 5 { 6 $y=10; // 局部变量 7 echo "<p>测试函数内变量:<p>"; 8 echo "变量 x 为: $x"; 9 echo "<br>"; 10 echo "变量 y 为: $y"; 11 } 12 13 myTest(); 14 15 echo "<p>测试函数外变量:<p>"; 16 echo "变量 x 为: $x"; 17 echo "<br>"; 18 echo "变量 y 为: $y"; 19 ?>
先看运行结果:
注意到这里,函数内部不能访问全局的变量$x,函数外部不能函数内部的变量。前面一条就有点说不过去了,既然是全局变量为什么不能访问呢?这里就涉及到了咱们上边说的php的四种不同的变量作用域。
要是想在函数内部访问到全局变量需要在函数的内部声明:global $x;
再看一段代码:
1 <?php 2 $x=5; 3 $y=10; 4 5 function myTest() 6 { 7 global $x,$y; 8 $y=$x+$y; 9 } 10 11 myTest(); 12 echo $y; // 输出 15 13 ?>
这样就可以正确的访问全局变量了。这里我们要解释一下为什么不声明是访问不到的:PHP 将所有全局变量存储在一个名为 $GLOBALS[index] 的数组中。 index 保存变量的名称。这个数组可以在函数内部访问,也可以直接用来更新全局变量。
所以上面的代码其实可以这样写:
1 <?php 2 $x=5; 3 $y=10; 4 5 function myTest() 6 { 7 $GLOBALS['y']=$GLOBALS['x']+$GLOBALS['y']; 8 } 9 10 myTest(); 11 echo $y; 12 ?>
Static 作用域
当一个函数完成时,它的所有变量通常都会被删除。然而,有时候您希望某个局部变量不要被删除。要做到这一点,请在您第一次声明变量时使用 static 关键字:
1 <?php 2 3 function myTest() 4 { 5 static $x=0; 6 echo $x; 7 $x++; 8 } 9 10 myTest(); 11 myTest(); 12 myTest(); 13 14 ?>
然后,每次调用该函数时,该变量将会保留着函数前一次被调用时的值。
注释:该变量仍然是函数的局部变量。
Parameter参数作用域
参数是通过调用代码将值传递给函数的局部变量。(跟JavaScript的参数差不多)
参数是在参数列表中声明的,作为函数声明的一部分,先看一段代码就能理解了:
1 <?php 2 function myTest($x) 3 { 4 echo $x; 5 } 6 myTest(5); 7 ?>
其实PHP的参数和JS的差不多。如果能很好地理解JS中的作用域,其实PHP的也就那么回事。