设为首页 收藏本站
查看: 1527|回复: 0

[经验分享] PHP 7: PHP 变量和常量的定义

[复制链接]

尚未签到

发表于 2015-8-23 07:00:25 | 显示全部楼层 |阅读模式
本章说说变量的定义。
如果对于变量和常量的定义,你会注意几个方面呢?你可能会想到:

  • 如何定义变量,它和C# 等语言有什么不同呢?
  • 变量区分大小写吗?
  • PHP的变量还有其他重要的吗?
  • 常量和变量的定义一样吗?
分别讲述吧。
1.如何定义变量,它和C# 等语言有什么不同呢?
  PHP 中的变量用一个美元符号后面跟变量名来表示。变量名是区分大小写的。例如:

<?php
$var='Jim';
  $VAR='Kimi;
  echo "$var,$VAR";//输出&#8220;Jim,Kimi"
?>你可能还关心变量的命名,其实和大多数语言一样。
2. 变量区分大小写吗?
   如 1里说的,区分大小写。
  注意,需要说明的一点是自PHP4以来,引入了引用赋值的概念,其实和多数语言的引用类似,不过我觉得最类似的是C/C++.因为它也用到了"&"符号。例如:
1 <?php
2 $foo = 'Bob';              // 赋值'Bob'给foo
3 $bar = &$foo;              // 通过$bar引用.注意&符号
4 $bar = "My name is $bar";  // 修改 $bar DSC0000.gif
5 echo $bar;
6 echo $foo;                // $foo 也修改了.
7 ?> 和其他语言一样,只能对有变量名的变量才可以引用。
3. PHP其他重要点
预定义变量

预定义变量在PHP是一个重要的概念。PHP 提供了大量的预定义变量。由于许多这些变量依赖于运行的服务器的版本和设置,及其它因素,所以并没有详细的说明文档。一些预定义变量在PHP 以命令行形式运行时并不生效。

需要注意的是 在PHP 4.2.0 以及后续版本中,PHP 指令 register_globals 的默认值为off。这是 PHP 的一个主要变化。让 register_globals 的值为off 将影响到预定义变量集在全局范围内的有效性。例如,为了得到DOCUMENT_ROOT 的值,将必须使用$_SERVER['DOCUMENT_ROOT'] 代替$DOCUMENT_ROOT,又如,使用$_GET['id'] 来代替 $id 从 URLhttp://www.example.com/test.php?id=3 中获取id 值,亦或使用 $_ENV['HOME'] 来代替$HOME 获取环境变量 HOME 的值。

从 PHP 4.1.0 开始,PHP 提供了一套附加的预定数组,这些数组变量包含了来自 web服务器(如果可用),运行环境,和用户输入的数据。这些数组非常特别,它们在全局范围内自动生效,例如,在任何范围内自动生效。因此通常被称为自动全局变量(autoglobals)或者超全局变量(superglobals)。(PHP中没有用户自定义超全局变量的机制。)超全局变量罗列于下文中;而且,你也将注意到旧的预定义数组($HTTP_*_VARS)仍旧存在。自 PHP 5.0.0 起,长格式的 PHP预定义变量可以通过设置register_long_arrays 来屏蔽。
下表是PHP的超全局变量:
超全局变量
描述
$GLOBALS包含一个引用指向每个当前脚本的全局范围内有效的变量。该数组的键名为全局变量的名称。从PHP 3 开始存在 $GLOBALS 数组。
$_SERVER变量由 web 服务器设定或者直接与当前脚本的执行环境相关联。类似于旧数组 $HTTP_SERVER_VARS数组(依然有效,但反对使用)。
$_GET经由 URL 请求提交至脚本的变量。类似于旧数组 $HTTP_GET_VARS数组(依然有效,但反对使用)。
$_POST经由 HTTP POST 方法提交至脚本的变量。类似于旧数组 $HTTP_POST_VARS数组(依然有效,但反对使用)。
$_COOKIE经由 HTTP Cookies 方法提交至脚本的变量。类似于旧数组 $HTTP_COOKIE_VARS数组(依然有效,但反对使用)。
$_FILES经由 HTTP POST 文件上传而提交至脚本的变量。类似于旧数组 $HTTP_POST_FILES数组(依然有效,但反对使用)
$_ENV执行环境提交至脚本的变量。类似于旧数组 $HTTP_ENV_VARS数组(依然有效,但反对使用)。
$_REQUEST 经由 GET,POST 和 COOKIE机制提交至脚本的变量,因此该数组并不值得信任。所有包含在该数组中的变量的存在与否以及变量的顺序均按照php.ini 中的 variables_order配置指示来定义。此数组在 PHP 4.1.0 之前没有直接对应的版本。参见import_request_variables()
$_SESSION当前注册给脚本会话的变量。类似于旧数组$HTTP_SESSION_VARS 数组(依然有效,但反对使用)
变量的应用范围
每个变量都有应用范围,那么PHP是怎么定义的呢?还是先看看下面代码吧:

1 <?php
2  $var=0;
3  function test($index)
4  {
5      $var=$var+1;
6      echo "The ".$index." number is ".$var."<br>";
7  }
8  test(1);
9  test(2)
10 ?>你认为以上的代码会显示什么结果呢?
如果你认为是下面:
结果1:

The 1 number is 1
The 2 number is 2不好意思,你的结果是错误的。
其实正确的结果应该是:
结果2

The 1 number is 1
The 2 number is 1那么你从其中发现了什么呢?我们可以知道虽然第2行的代码定义在外面,但第5行的变量和它是不一样的。第5行的变量仅在这个函数里使用。进一步的,如果我想调用第一行的变量而显示结果2.代码可以如下:

1 <?php
2  $var=0;
3  function test($index)
4  {
5      global $var;
6      $var=$var+1;
7      echo "The ".$index." number is ".$var."<br>";
8  }
9  test(1);
10  test(2)
11 ?>这个代码段和上面的代码段有何区别呢?注意第5行,多了一个global关键字。明白了吧。
那么还有没有其他方法呢?答案是肯定的。
代码如下:

1 <?php
2  $var=0;
3  function test($index)
4  {
5      
6      $GLOBALS["var"]=$GLOBALS["var"]+1;
7      echo "The ".$index." number is ".$GLOBALS["var"]."<br>";
8  }
9  test(1);
10  test(2)
11 ?>代码有什么特殊的吗?那就是用到了$GLOBALS这个超全局变量。
PHP也有静态变量的说法。不过静态变量一般用在函数里,只能是局部变量了。看看下面代码吧:

1 <?php
2 function Test()
3 {
4    static $a = 0;
5    echo $a."<br>";
6    $a++;
7 }
8 Test();
9 Test();
10 ?> 结果为

1
2
PHP还有一个相当令人兴奋的特性:可变变量
所谓可变变量,就是一个变量的变量名可以动态的设置和使用。
看看下面的例子:

1 <?php
2  $a="hello";
3  $hello="world";
4  echo $a." ".$$a;
5 ?> 输出的结果居然是hello,world.太神奇了。$$a其实就是$hello,因为$a的值是hello。
变量就这多了。下面看看常量。

常量
PHP的常量是不是前面加const呢?让我们看一看。
不是的。在PHP必须用下面的方式定义。
bool define ( string name, mixed value [, bool case_insensitive] )
name 为常量名,value为常量的值。case_insensitive]为大小写敏感。默认为敏感。例如:

1 <?php
2 define("CONSTANT", "Hello world.");
3 echo CONSTANT; // outputs "Hello world."
4 echo Constant; // outputs "Constant" and issues a notice.
5
6 define("GREETING", "Hello you.", true);
7 echo GREETING; // outputs "Hello you."
8 echo Greeting; // outputs "Hello you."
9
10 ?>
  常量和变量不同:

  •   常量前面没有美元符号($);
  •   常量只能用 define() 函数定义,而不能通过赋值语句;
  •   常量可以不用理会变量范围的规则而在任何地方定义和访问;
  •   常量一旦定义就不能被重新定义或者取消定义;
  •   常量的值只能是标量。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-102780-1-1.html 上篇帖子: PHP实现MVC开发: 一个简单的MVC 下篇帖子: 第一个有点作用的PHP扩展
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表