Php入门教程之PHP 变量基本语法

变量是php中非常常用的一个东西,所有的操作都要经过变量来传递,下面我来给各位同学介绍在php中变量的一些常用用法与关于php变量基础知识,

具体方法:

PHP变量用于存储字符、数字、数组甚至对象内容等,以便在我们需要的地方使用.定义一个变量的语法:

$变量名 = 值;

使用变量的例子:

实例代码如下:

  1. <!–?php  
  2.  $var_char = "你好!";  
  3.  echo $var_char;  
  4.  ?> 
执行这段代码输出的结果是:

1 你好! 

从这个例子可以看出,变量名以 $ 开始,标明这是一个变量.变量名以字母(a-z、A-Z)或者下划线 _ 开始,后面可以跟任意字母或数字以及下划线,但不能是空格.如下这些变量名是有效的:

 $var_char
 $varChar
 $_varChar
 $var_char5

提示:关于变量命名,我们建议变量名以标明其实际语意的组合为佳,如 $my_name 或 $myName 格式.

全局变量global

全局变量便是其中之一,当然这个观点颇具争议,有许多人还是建议禁用全局变量,使用不当对造成程序的可读性很差!结构混乱,调试更是一头雾水,但是不可否认他的便捷,这便是php为什么会用全局变量global原因吧!…

今天就遇到了php 全局变量不起作用的问题.先上一段简单的代码:

实例代码如下:

  1. <!–?php 
  2. $a = 0 ; 
  3. function Test() 
  4.     $a =1; 
  5. Test(); 
  6. echo $a
  7. ?> 

上面的代码中输出是0,那是因为函数体Test内$a变量被缺省设置为局部变量,$a的作用域就是在Test内.修改代码如下:

  1. ?<!–?php 
  2. $a = 0 ; 
  3. function Test() 
  4.    global $a;//申明函数体Test内使用的$a变量为global全局变量 
  5.    $a =1; 
  6. Test(); 
  7. echo $a
  8. ?> 

申明函数体Test内使用的$a变量为global全局变量后,使得$a的作用全局,所以输出为1.上面的实例只是基本的global全局变量知识,下面我们看看复杂点的:

实例代码如下:

  1. //A.php 文件 
  2. <!–?php 
  3. function Test_Global() 
  4.     include 'B.php'
  5.     Test(); 
  6. $a = 0 ; 
  7. Test_Global(); 
  8. echo $a
  9. ?> 
  10. //B.php 文件 
  11. <!–?php 
  12. function Test() 
  13.    global $a;//申明函数体Sum内使用的$a变量为global全局变量 
  14.    $a =1; 
  15. ?> 

为什么输出的却是0?!!

在用户自定义函数中,一个局部函数范围将被引入.任何用于函数内部的变量按缺省情况将被限制在局部函数范围内(包括include 和 require 导入的文件内的变量)!

解释:A.php文件的内Test_Global是定义好的第三方函数,该函数用include导入了B.php文件内的$a的global全局变量,所以$a被限制在Test_Global局部函数范围内,所以B.php文件内的$a的作用范围都在Test_Global内,而不是作用了整个A.php内….

解决方案:

1. 冲出局部函数//A.php 文件

实例代码如下:

  1. <!–?php 
  2. function Test_Global() 
  3.     Test(); 
  4. include 'B.php'//将include 从局部Test_Global函数中移出 
  5. $a = 0 ; 
  6. Test_Global(); 
  7. echo $a
  8. ?> 
  9. //B.php 文件 
  10. <!–?php 
  11. function Test() 
  12.     global $a
  13.     $a =1; 
  14. ?> 

2.优秀的访问器

实例代码如下:

  1. //A.php 文件 
  2. <!–?php 
  3. include 'B.php'
  4. $a =0; 
  5. Set_Global($a); 
  6. echo $a
  7. ?> 
  8. //B.php 文件 
  9. <!–?php 
  10. function Set_Global(&$var
  11.     $var=1; 
  12. ?> 

php变量 引用函数 static变量

“无论怎样声明变量(按值或按引用),总之在PHP脚本的任何位置都可以声明变量.但是,声明的位置会大大影响访问变量的范围.这个可访问的范围称为作用域(scope)” –PHP与MySQL程序设计.在了解php变量之前,我们先看看段式内存管理架构的内存段的划分.通常操作系统会将物理内存划分为以下几个逻辑段.

Text-Segment,这个段最大的特点就是只读.一般存放可执行代码,也有可能常量也存放在这里,比如字符串常量 BSS-Segment,这里存放了那些没有初始化的变量.某种意义来讲,没有初始化的变量都是垃圾,不可用 Data-Segment,这里存放了全局变量和静态变量,直到脚本运行结束,操作系统才会回收这里的内存空间,变量亦会被销毁.

Stack-Heap Segment 函数参数与本地变量(也称局部变量)存放在堆中(stack),还有返回值等等.用完了,操作系统就会回收这部分内存空间.对于C程序员而言,可以自行从栈中(heap)申请内存空间,用完了,也需要自己手动释放. 

作为PHP程序言而言,我们关心的是全局变量、静态变量、局部变量、函数参数以及函数返回值.局部变量和函数参数基本上一样,在初始化的时候分配内存空间,退出函数后操作系统会回收内存空间。而全局变量与静态变量要直php脚本运行结束后,内存空间才会被释放.与全局变量不同的时,所有静态变量在程序执行之前就初始化并且分配了内存空间.

注:

1.函数外部声明静态变量意义不大,函数内部声明静态变量受限于作用域,函数外部不能修改函数内部静态变量.

2.引用变量,也是变量,只不过它的值是变量的内存地址.

php保留字global和static实例代码如下:

  1. <!–?php 
  2. $i = $j = 8; 
  3. function global_var() { 
  4.    global $j$b
  5.    $c = $j = $b = $i = 4; 
  6. global_var(); 
  7. echo "i:$i, j:$j b:$b c:$c n"//i:8, j:4 b:4 c: 
  8. ?> 

函数外和内都有变量$i,但是他们二个是完全不同的变量.函数外的$i是全局变量,该内存空间直到脚本运行结束后才会被释放.函数内的$i是局部变量,程序流经过函数的时候,初始化,退出函数的时候,内存被系统回收,再次调用函数,则再次分配内存空间和回收内存空间.二次分配的内存空间有可能是同一内存地址,也有可能不能同一内存地址.

与$i不同的是$j,通过关键字global将局部变量”转为”全局变量.当调用函数global_var()的时候,并不会重新给$j分配内存空间.同样的,可以在函数外打印$b,却不能打印$c是因为$b是全局变量,不会被销毁.而$c则不能打印,$c已经不存在了.在退出函数就给销毁了.

实例代码如下:

  1. <!–?php 
  2. $a = 2; 
  3. static $b = 2; 
  4. static $c = 3; 
  5. function global_var() { 
  6.     static $i$c
  7.     global $j$a
  8.     $c = $a = $b = $i = $j = 4; 
  9. global_var(); 
  10. echo "a:$a b:$b c:$c i:$i j:$j"//a:4 b:2 c:3 i: j:4 
  11. ?> 

首先,我们看函数外的$b和$c,即是全局变量又是static变量.这里static修饰没有太大的意义,因为他们都存放在数据段(data-segment),直到脚本运行完了之后才会被回收。然后,我们再看函数里面的$i和$c,函数调用后,$i和$c其实都没有被回收,但是$i输出是NULL和$c输出是3,这是因为他们的作用域是函数内部,不是函数外部,也就是说$i和$c在函数外是不可见的.函数内static变量的意义就在于此:仅函数内部可见且不会被销毁。也就是说,保证函退出函数,变量也不会被回收,但又不会被其它函数修改.(注:函数外和函数内的$c是二个不同的变量)

实例代码如下:

  1. <!–?php 
  2. function global_var() { 
  3.    static $i
  4.    ++$j
  5.    ++$i
  6.    echo "j:$j i:$i n"
  7. global_var(); //j:1 i:1  
  8. global_var();  //j:1 i:2 
  9. global_var();  //j:1 i:3 
  10. ?> 

上例中,变量$j一直都是1,而$i每调用一次就累加1.这是因为,局部变量存放在堆段,每次退出函数时都会被回收.而$i存放在存放在数据段(data-segment),直到程序执行完毕才会被回收.我们平常说的static变量,如果没有特别指明,都说的是函数内部的static变量.

引用函数与static变量

既然static变量要直到脚本执行结束,才会被销毁.那么,有没有办法访问该变量的值呢?我们来看看下面的示例:

实例代码如下:

  1. <!–?php 
  2. get_local_static_var(); 
  3. $ptr = &get_local_static_var(); 
  4. get_local_static_var(); 
  5. ++$ptr
  6. get_local_static_var(); 
  7. what_i($ptr); 
  8. get_local_static_var();  //?? 
  9. what_p($ptr); 
  10. get_local_static_var();  //?? 
  11.  
  12. function &get_local_static_var() { 
  13.     static $i
  14.     ++$i
  15.     echo "i:$i n"
  16.     return $i
  17.  
  18. function what_i($ptr) { 
  19.    $i = &get_local_static_var(); 
  20.    ++$i
  21.    ++$ptr
  22.  
  23. function what_p(&$ptr) { 
  24.    $i = &get_local_static_var(); 
  25.    ++$i
  26.    ++$ptr
  27. ?> 

二个凝问号处,分别输出是8和12,这就说明了只要变量没有被销毁,还是可以被访问.我们可以通过引用函数将static变量的地址返回其它函数,其它函数则可通过static变量的地址访问并且修改它的值.

上例第一处??,为什么是8,而不是9.这是因为what_i($ptr)函数,要求参数是按值传递,即此处的$ptr实参值是5,且参数$ptr和全局变量$ptr是二个不同的变量.第二处??的值是12,为什么不是11的道理亦是如此.what_p(&$ptr)函数,要求参数是按引用传递,即此处的$ptr是指向static变量$i的地址,需要注意的是参数$ptr和全局变量$ptr也是二个不同的变量,只不过他们都指向同一个地方.

drupal应用赏析

drupal定义了一个drupal_static函数,其它函数的static变量都存放在一个数组中,然后对drupal应用到的所有static进行统一管理,比如赋值,重置,删除等.我觉得,这是一个好办法.

实例代码如下:

  1. <!–? 
  2. function &drupal_static($name$default_value = NULL, $reset = FALSE) { 
  3.   static $data = array(), $default = array(); 
  4.   if (!isset($name)) { 
  5.     foreach ($default as $name => $value) { 
  6.       $data[$name] = $value
  7.     } 
  8.     return $data
  9.   } 
  10.   if ($reset) { 
  11.     if (array_key_exists($name$default)) { 
  12.       $data[$name] = $default[$name]; 
  13.     } 
  14.     else { 
  15.       return $data
  16.     } 
  17.   } 
  18.   elseif (!array_key_exists($name$data)) { 
  19.     $default[$name] = $data[$name] = $default_value
  20.   } 
  21.   return $data[$name]; 
  22.  
  23. function ip_address() { 
  24.   $ip_address = &drupal_static(__FUNCTION__); 
  25.  
  26.   if (!isset($ip_address)) { 
  27.     $ip_address = $_SERVER['REMOTE_ADDR']; 
  28.  
  29.     if (variable_get('reverse_proxy', 0)) { 
  30.       if (array_key_exists('HTTP_X_FORWARDED_FOR'$_SERVER)) { 
  31.         $reverse_proxy_addresses = variable_get('reverse_proxy_addresses'array()); 
  32.         if (!emptyempty($reverse_proxy_addresses) && 
  33.      in_array($ip_address$reverse_proxy_addresses, TRUE) 
  34.     ) { 
  35.           $ip_address_parts = explode(','$_SERVER['HTTP_X_FORWARDED_FOR']); 
  36.           $ip_address = trim(array_pop($ip_address_parts)); 
  37.         } 
  38.       } 
  39.       if (array_key_exists('HTTP_X_CLUSTER_CLIENT_IP'$_SERVER)) { 
  40.         $ip_address = $_SERVER['HTTP_X_CLUSTER_CLIENT_IP']; 
  41.       } 
  42.     } 
  43.   } 
  44.  
  45.   return $ip_address
  46.  
  47. ip_address(); 
  48. //在drupal中很多这样的应用方式,将其它函数的static变量都存放到一个地方,即drupal_static的data中,然后再统一管理,比如重置等等。 
  49. ?> 

 

波比源码 – 精品源码模版分享 | www.bobi11.com
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,请使用WINRAR解压,如遇到无法解压的请联系管理员!

波比源码 » Php入门教程之PHP 变量基本语法

发表评论

Hi, 如果你对这款模板有疑问,可以跟我联系哦!

联系站长
赞助VIP 享更多特权,建议使用 QQ 登录
喜欢我嘛?喜欢就按“ctrl+D”收藏我吧!♡