PHP学习笔记之php变量用法

如果对于变量和常量的定义,你会注意几个方面呢?你可能会想到:

•如何定义变量,它和C# 等语言有什么不同呢?
•变量区分大小写吗?
•PHP的变量还有其他重要的吗?

•常量和变量的定义一样吗?
 分别讲述吧。

1.如何定义变量,它和C# 等语言有什么不同呢?
   PHP 中的变量用一个美元符号后面跟变量名来表示。变量名是区分大小写的。例如:

 代码如下 复制代码

<?php
 $var='Jim';
  $VAR='Kimi;
  echo "$var,$VAR";//输出“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
5 echo $bar;
6 echo $foo;                // $foo 也修改了.
7 ?>

和其他语言一样,只能对有变量名的变量才可以引用

php中的可变变量说白了,就是拿一个变量的值解析成一个变量名,去读那个变量名的值。实例:

 代码如下 复制代码

 

<?php
    $a = "China";  //变量a
    $b = "a";       //变量b
    $China = "I'm Chinese !"; //变量China
    $f = "b";  //变量f
   
    echo $a."<br />";  //输出 China
    echo $$a."<br />"; //输出 I'm Chinese  --这里像要当做可变变量解析,必须在前面多加一个$符号
    $a = "f";  //改变变量指向的名称(这里就是可变变量的应用)
    echo $$a."<br />"; //经过上面指向变量f后输出 b
    $a = "b"; //同上
    echo $$a."<br /><br />"; //输出 a
   
    echo $b."<br />"; //输出 a
    echo $$b."<br />"; //输出 b
    echo $$$b."<br /><br />"; //输出 a
   
    echo $f."<br />"; //输出 b
    echo $$f."<br />"; //输出 a
    echo $$$f."<br />"; //输出 b
    echo $$$$f."<br /><br />"; //输出 a
   
    $$a = "China"; //前面最后一个已经更改了变量为b所谓$$a=$b 也就是改变的$b的值
    echo $b."<br />"; //输出 China
    echo $$b; //输出 I'm Chinese
?>

注意:可变变量不能应用于$this和超全局变量 (php变量的作用域和其他高级编程语言有所不同。看代码)

 代码如下 复制代码

<?php
    $name = 'man';
    $$name = 'abc'; //如果事先没有man这个变量。就新建一个man变量。 然后把abc赋值过去
    $$$name = 'def';
    echo $man."<br />"; //输出abc
    echo $abc; //输出def
   
    echo "<br /> <hr />";
    function show()
    {
        global $name; //这里的global并不是设置为全局变量。而是引用
        echo $name."<br />";  //输出man
    }
   
    function showtwo()
    {
        //global $name;
        //echo $name."<br />";
        echo $GLOBALS['name']; //超全局变量数组
    }
   
    show();
    showtwo();
?>

变量函数:

 代码如下 复制代码

<?php
        function b()
        {
            echo "这是B";   
        }
        function c($name = "China") //设默认值
         {
            echo "这是$name";
        }
       
        $a = 'b';
        $a(); //找值所在的函数
         $a = 'c';
        $a(); ?>

 

 

可变变量的一个典型应用:

 代码如下 复制代码

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>无标题文档</title>
</head>

<body>
   
    <div>
        <form action="#" method="post">
            <label>name: </label>
            <input type="text" name="name" /><br />
            <label>pwd : </label>
            <input type="text" name="pwd" /><br />
            <label>tag : </label>
            <input type="text" name="tag" /><br />
            <input type="submit" value="提交" />
        </form>
    </div>
<?php
   
        foreach($_POST as $key=>$value)
        {       
            //print_r($_POST);
            $$key = $value;
        }
        //extract($_POST); //从数组中将变量导入到当前的符号表 --自行查找php手册
        echo $name."<br />";
        echo $pwd."<br />";
        echo $tag."<br />";
    ?>
</body>
</html>

变量作用域 .

变量范围
变量的范围即它定义的上下文背景(译者:说白了,也就是它的生效范围)。大部分的 PHP 变量只有一个单独的范围。这个单独的范围跨度同样包含了 include 和 require 引入的文件。范例:

 代码如下 复制代码

<?php
$a = 1;
include "b.inc";
?> 

这里变量 $a 将会在包含文件 b.inc 中生效。但是,在用户自定义函数中,一个局部函数范围将被引入。任何用于函数内部的变量按缺省情况将被限制在局部函数范围内。范例:

 代码如下 复制代码

<?php
$a = 1; /* global scope */

function Test()
{
   echo $a; /* reference to local scope variable */
}

Test();
?> 

这个脚本不会有任何输出,因为 echo 语句引用了一个局部版本的变量 $a,而且在这个范围内,它并没有被赋值。你可能注意到 PHP 的全局变量和 C 语言有一点点不同,在 C 语言中,全局变量在函数中自动生效,除非被局部变量覆盖。这可能引起一些问题,有些人可能漫不经心的改变一个全局变量。PHP 中全局变量在函数中使用时必须申明为全局。

The global keyword
首先,一个使用 global 的例子:

例子 12-1. 使用 global

 代码如下 复制代码

<?php
$a = 1;
$b = 2;

function Sum()
{
   global $a, $b;

   $b = $a + $b;
}

Sum();
echo $b;
?> 
 

以上脚本的输出将是 "3"。在函数中申明了全局变量 $a 和 $b,任何变量的所有引用变量都会指向到全局变量。对于一个函数能够申明的全局变量的最大个数,PHP 没有限制。

在全局范围内访问变量的第二个办法,是用特殊的 PHP 自定义 $GLOBALS 数组。前面的例子可以写成:

例子 12-2. 使用 $GLOBALS 替代 global

 代码如下 复制代码

<?php
$a = 1;
$b = 2;

function Sum()
{
   $GLOBALS["b"] = $GLOBALS["a"] + $GLOBALS["b"];
}

Sum();
echo $b;
?> 
 

在 $GLOBALS 数组中,每一个变量为一个元素,键名对应变量名,值变量的内容。$GLOBALS 之所以在全局范围内存在,是因为 $GLOBALS 是一个超全局变量。以下范例显示了超全局变量的用处:

例子 12-3. 演示超全局变量和作用域的例子

 代码如下 复制代码

<?php
function test_global()
{
   // 大多数的预定义变量并不 "super",它们需要用 'global' 关键字来使它们在函数的本地区域中有效。
   global $HTTP_POST_VARS;

   print $HTTP_POST_VARS['name'];

   // Superglobals 在任何范围内都有效,它们并不需要 'global' 声明。Superglobals 是在 PHP 4.1.0 引入的。
   print $_POST['name'];
}
?> 
 

使用静态变量
变量范围的另一个重要特性是静态变量(static variable)。静态变量仅在局部函数域中存在,但当程序执行离开此作用域时,其值并不丢失。看看下面的例子:

例子 12-4. 演示需要静态变量的例子

 代码如下 复制代码
<?php
function Test ()
{
   $a = 0;
   echo $a;
   $a++;
}
?> 

 

本函数没什么用处,因为每次调用时都会将 $a 的值设为 0 并输出 "0"。将变量加一的 $a++ 没有作用,因为一旦退出本函数则变量 $a 就不存在了。要写一个不会丢失本次计数值的计数函数,要将变量 $a 定义为静态的:

例子 12-5. 使用静态变量的例子

 代码如下 复制代码
<?php
function Test()
{
   static $a = 0;
   echo $a;
   $a++;
}
?> 
 

现在,每次调用 Test() 函数都会输出 $a 的值并加一。

静态变量也提供了一种处理递归函数的方法。递归函数是一种调用自己的函数。写递归函数时要小心,因为可能会无穷递归下去。必须确保有充分的方法来中止递归。一下这个简单的函数递归计数到 10,使用静态变量 $count 来判断何时停止:

例子 12-6. 静态变量与递归函数

 代码如下 复制代码

<?php
function Test()
{
   static $count = 0;

   $count++;
   echo $count;
   if ($count < 10) {
   Test ();
   }
   $count--;
}
?> 
 

注: 静态变量可以按照上面的例子声明。如果在声明中用表达式的结果对其赋值会导致解析错误。

例子 12-7. 声明静态变量

 代码如下 复制代码

<?php
function foo(){
   static $int = 0; // correct
   static $int = 1+2; // wrong (as it is an expression)
   static $int = sqrt(121); // wrong (as it is an expression too)

   $int++;
   echo $int;
}
?> 

 

全局和静态变量的引用
在 Zend 引擎 1 代,驱动了 PHP4,对于变量的 static 和 global 定义是以 references 的方式实现的。例如,在一个函数域内部用 global 语句导入的一个真正的全局变量实际上是建立了一个到全局变量的引用。这有可能导致预料之外的行为,如以下例子所演示的:

 代码如下 复制代码

<?php
function test_global_ref() {
   global $obj;
   $obj = &new stdclass;
}

function test_global_noref() {
   global $obj;
   $obj = new stdclass;
}

test_global_ref();
var_dump($obj);
test_global_noref();
var_dump($obj);
?> 

执行以上例子会导致如下输出:

NULLobject(stdClass)(0) {}

类似的行为也适用于 static 语句。引用并不是静态地存储的:

 代码如下 复制代码

<?php
function &get_instance_ref() {
   static $obj;

   echo "Static object: ";
   var_dump($obj);
   if (!isset($obj)) {
   // 将一个引用赋值给静态变量
   $obj = &new stdclass;
   }
   $obj->property++;
   return $obj;
}

function &get_instance_noref() {
   static $obj;

   echo "Static object: ";
   var_dump($obj);
   if (!isset($obj)) {
   // 将一个对象赋值给静态变量
   $obj = new stdclass;
   }
   $obj->property++;
   return $obj;
}

$obj1 = get_instance_ref();
$still_obj1 = get_instance_ref();
echo "/n";
$obj2 = get_instance_noref();
$still_obj2 = get_instance_noref();
?> 

执行以上例子会导致如下输出:

Static object: NULLStatic object: NULLStatic object: NULLStatic object: object(stdClass)(1) {  ["property"]=>  int(1)}

上例演示了当把一个引用赋值给一个静态变量时,第二次调用 &get_instance_ref() 函数时其值并没有被记住

时间: 2024-09-16 05:29:25

PHP学习笔记之php变量用法的相关文章

C#学习笔记- 随机函数Random()的用法详解_C#教程

Random.Next() 返回非负随机数: Random.Next(Int) 返回一个小于所指定最大值的非负随机数 Random.Next(Int,Int) 返回一个指定范围内的随机数,例如(-100,0)返回负数 1.random(number)函数介绍 见帮助文档,简单再提一下,random(number)返回一个0~number-1之间的随机整数.参数number代表一个整数. 示例: trace(random(5)); 2.Math.random() 见帮助文档.返回一个有14位精度的

C#学习笔记整理_变量等基础语法(必看篇)_C#教程

C#学习笔记1: 变量的作用域冲突时,调用实例变量:this.a,调用类变量:类名.a 常量总是静态的,必须初始化,一般用全大写格式,声明关键字为const,如const int NUNBE = 10; C#的基本预定义类型内置于.NET Framework结构中(System),object是基类: 整型:System.SByte.System.Int16.System.Int32.System.Int64 有符号的8位.16位.32位.64位分别表示为sbyte.short.int.long

Symfony2框架学习笔记之表单用法详解_php实例

本文实例讲述了Symfony2框架表单用法.分享给大家供大家参考,具体如下: 对于一个Web开发者来说,处理HTML表单是一个最为普通又具挑战的任务.Symfony2集成了一个Form组件,让处理表单变的容易起来.在这一节里,我们将 从基础开始创建一个复杂的表单,学习表单类库中最重要的内容. Symfony2 的Form组件是一个独立的类库,你可以在Symfony2项目之外使用它. 创建一个简单的表单: 假设你要创建一个应用程序的todo列表,需要显示一些任务.因为你的用户需要编辑和创建任务,所

《perl实例精解》学习笔记 第二天变量、数组、哈希 上

一,关于变量的描述 变量是一种数据项,其值可随着程序的运行而发生变化. 变量可以位于程序的任何位置,并且不需要像在高级语言中那样声明它为特点的类型. 变量的值可以为字符串,数字或是它们的组合. 二,perl变量的类型 A.标量型 $变量=值: B.数组型   @数组=('值1','值2','值3'): C.关联数组(常称散列[hash])          %hash=('标量1' => '值1',                 '标量2' => '值2', ) : 三,变量的作用范围 变量

Symfony2框架学习笔记之HTTP Cache用法详解_php实例

本文实例讲述了Symfony2框架HTTP Cache用法.分享给大家供大家参考,具体如下: 富web应用程序的本质意味着它们的动态.无论你的应用程序多么有效率,每个请求比起静态文件来说总会存在很多的耗费.对于大多数web程序来说,这没什么. Symfony2非常的轻快,无论你做些严重超载的请求,每个请求将会得到很快的回复,而不会对你的服务器造成压力.但是随着你站点的成长,负载将成为一个严重的问题.对每个请求处理应该只被正常执行一次.这就是缓存真正要达成的目标. 站在巨人肩膀上的缓存: 提高一个

javascript学习笔记之数组变量声明

  其实做过开发的人,接触JavaScript时,都有种似是而非的感觉,对JavaScript的许多语法都感到非常熟悉,其在结构化编程方面与其他的主流语言区别不大.但是主要显著的一点是,JavaScript在变量声明时,不需要声明变量的类型,直接通过变量的构成来查看变量的类型. 如:  代码如下 复制代码 var str="This is some string"; 变量str是表示一个字符串,用关键字var声明变量. 对于数组,变量声明如下:  代码如下 复制代码 var a=new

Android学习笔记之ActionBar Item用法分析

本文实例讲述了Android ActionBar Item用法.分享给大家供大家参考,具体如下: 这里主要讲述ActionBar Item的使用方法.在手机上,按Menu键出现Menu菜单,但是在平板中可以把菜单放在ActionBar里面,放置的Item也比手机上多,下面详细介绍其用法: 1.在Androidmanifest.xml里面加上 <uses-sdk Android:minSdkVersion="11"/> 或者 <uses-sdk android:targ

ExtJs学习笔记(8)_TabPanel的用法

啥也不说了,直接上代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv=&

JavaScript学习笔记之DOM基础用法

.DOM:Document Object Model文档对象模型是用于HTML和XML文档的应用程序API.DOM提供了结构化的文档表现形式, 允许程序修改文档的内容和视觉表现.从本质上说,其把网页和脚本或编程语言连接了起来. 2.对于窗口中的脚本,默认引用的是当前窗口的"window"对象.如果需要访问其他框架或窗口的DOM内容,应当显式 的调用窗口对象. eg:对于如下页面:    代码如下 复制代码   //调用如下: window.parent.frames[1].docume