使用变量的例子

作者:美狮美高梅官方网站

这些PHP的概念,有些刚开始比较难懂,很难理解,我把他们都列出来,希望能帮助一些人,在前进的路上少点荆棘。

具体方法

1. variable variables(变量的变量)

PHP 变量

variable_variables.php

PHP变量用于存储字符、数字、数组甚至对象内容等,以便在我们需要的地方使用。

复制代码 代码如下:
$a = 'hello';
$hello = 'hello everyone';

定义一个变量的语法:

echo $$a.'
';

$变量名 = 值;

$b = 'John';
$c = 'Mary';
$e = 'Joe';

使用变量的例子:

$students = array('b','c','e');

 

echo ${$students[1]};
/*
foreach($students as $seat){
    echo $$seat.'
';
}
 $$var[1]
 ${$var[1]} for #1
*/

 代码如下

$a = 'hello';

 <?php 

将hello 赋值给 变量 $a, 于是 $$a = ${hello} = $hello = 'hello everyone';

 $var_char = "你好!"; 

如果对于 $$students[1],  这样会产生混乱,php的解释器可能无法理解,‘[' 虽然有较高运算符,但结果可能无法输出。

 echo $var_char; 

好的写法是:${$students[1]} = ‘Mary';

 ?>

2. array's function(数组函数)

执行这段代码输出的结果是:

 array_functions.php

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

复制代码 代码如下:
echo '

如下这些变量名是有效的:

shift & unshift

 $var_char

';
$numbers = array(1,2,3,4,5,6);
print_r($numbers);
echo '
';

 $varChar

// shifts first elemnt out of an array
// the index will reset
$a = array_shift($numbers);

 $_varChar

echo 'a: '.$a.'
';
print_r($numbers);

 $var_char5

// push element to the front of array
// returns the count of array and reset array index
$b = array_unshift($numbers, 'first');
echo '
b: '.$b.'
';
print_r($numbers);

提示

echo '

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


全局变量global

';
echo '

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

pop & push

今天就遇到了php 全局变量不起作用的问题.

';
// pop the last element out of array
$c = array_pop($numbers);
print_r($numbers);
echo '
';

先上一段简单的代码:

// push the element to the last of array
$d = array_push($numbers, 'last');
echo 'd: '.$d.'
';

 代码如下

print_r($numbers);

<?php
$a = 0 ;
function Test()
{
    $a =1;
}
Test();
echo $a;
?>

更多数组函数参考

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

3. dates and times (时间和日期)
有3种方法可以创建一个unix time(从1970/1/1 到现在的秒数)

 代码如下

time(); 返回当前的时间戳

<?php
$a = 0 ;
function Test()
{
   global $a;//申明函数体Test内使用的$a变量为global全局变量
   $a =1;
}
Test();
echo $a;
?>

mktime($hr, $min, $sec, $month, $day, $year); mktime(6,30,0,5,22,2012) 返回2012 5/22 6:30:00 的时间戳

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

strtotime($string); strtotime("+1 day") 返回明天这个时候的时间戳 更多 'last Monday' 'lasy Year'

 代码如下

checkdate($month, $day, $year); 验证一个日期是否为真 checkdate(5,32,2012) ? 'true' : 'false'; // return false

//A.php 文件

得到了时间戳后,我们需要对它进行转化为可读的,如2012/5/22

<?php
function Test_Global()
{
    include 'B.php';
    Test();
}

我们有2种方法 date($format, $timestamp) ; strftime($format [,$timestamp])

$a = 0 ;
Test_Global();
echo $a;
?>

推荐用第2种,strftime("%Y-%m-%d %H:%M:%S"); // return 2012-05-22 15:46:40

//B.php 文件

更多时间日期参考

<?php
function Test()
{
   global $a;//申明函数体Sum内使用的$a变量为global全局变量
   $a =1;
}
?>

5. server variables (服务器和执行环境信息)
$_SERVER

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

server_variables.php

在用户自定义函数中,一个局部函数范围将被引入。任何用于函数内部的变量按缺省情况将被限制在局部函数范围内(包括include 和 require 导入的文件内的变量)!
解释:A.php文件的内Test_Global是定义好的第三方函数,该函数用include导入了B.php文件内的$a的global全局变量,所以$a被限制在Test_Global局部函数范围内,所以B.php文件内的$a的作用范围都在Test_Global内,而不是作用了整个A.php内….

复制代码 代码如下:

解决方案:

echo 'SERVER details:
';
echo 'SERVER_NAME: '.$_SERVER['SERVER_NAME'].'
';
echo 'SERVER_ADD: '.$_SERVER['SERVER_ADDR'].'
';
echo 'SERVER_PORT: '.$_SERVER['SERVER_PORT'].'
';
echo 'DOCUMENT_ROOT: '.$_SERVER['DOCUMENT_ROOT'].'
';
echo '
';

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

echo 'Page details:
';
echo 'REMOTE_ADDR: '.$_SERVER['REMOTE_ADDR'].'
';
echo 'REMORT_PORT: '.$_SERVER['REMOTE_PORT'].'
';
echo 'REQUEST_URI: '.$_SERVER['REQUEST_URI'].'
';
echo 'QUERY_STRING: '.$_SERVER['QUERY_STRING'].'
';
echo 'REQUEST_METHOD: '.$_SERVER['REQUEST_METHOD'].'
';
echo 'REQUEST_TIME: '.$_SERVER['REQUEST_TIME'].'
';
echo 'HTTP_USER_AGENT: '.$_SERVER['HTTP_USER_AGENT'].'
';
echo '
';

 代码如下

更多详细信息

<?php
function Test_Global()
{
    Test();
}
include 'B.php'; //将include 从局部Test_Global函数中移出
$a = 0 ;
Test_Global();
echo $a;
?>

6.variable_scope(变量的作用域 global static)

//B.php 文件

static_variables.php
复制代码 代码如下:
function test()
{
    $a = 0;
    echo $a;
    $a++;
}

<?php
function Test()
{
    global $a;
    $a =1;
}
?>

test();
echo '
';
test();
echo '
';
test();
echo '
';

2.优秀的访问器

echo '

 代码如下


//A.php 文件
<?php
include 'B.php';
$a =0;
Set_Global($a);
echo $a;
?>

';
function test1()
{
    static $a = 0;
    echo $a;
    $a++;
}

//B.php 文件

test1();
echo '
';
test1();
echo '
';
test1();
echo '
';

<?php
function Set_Global(&$var)
{
    $var=1;
}
?>

test() 函数中的变量 $a 没有保存 $a++ 的结果 , 重复调用test() 并没有使 $a 的值增加

 

而test1() 函数中 变量 $a 申明了 staic $a = 0, 为静态变量。

php变量 引用函数 static变量

引用:A static variable exists only in a local function scope, but it does not lose its value when program execution leaves this scope.

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

一个静态变量 只能存在于本地的函数作用域内 也就是test1() 函数体内, 但是当程序离开这个test1() 作用域时,静态变量不会失去它的值,也就是 $a 变量会增加 1; 当重新调用 test1() 时,$a = 1;

Text-Segment,这个段最大的特点就是只读。一般存放可执行代码,也有可能常量也存放在这里,比如字符串常量
BSS-Segment,这里存放了那些没有初始化的变量。某种意义来讲,没有初始化的变量都是垃圾,不可用
Data-Segment,这里存放了全局变量和静态变量,直到脚本运行结束,操作系统才会回收这里的内存空间,变量亦会被销毁。
Stack-Heap Segment 函数参数与本地变量(也称局部变量)存放在堆中(stack),还有返回值等等。用完了,操作系统就会回收这部分内存空间。对于C程序员而言,可以自行从栈中(heap)申请内存空间,用完了,也需要自己手动释放。
作为PHP程序言而言,我们关心的是全局变量、静态变量、局部变量、函数参数以及函数返回值。局部变量和函数参数基本上一样,在初始化的时候分配内存空间,退出函数后操作系统会回收内存空间。而全局变量与静态变量要直php脚本运行结束后,内存空间才会被释放。与全局变量不同的时,所有静态变量在程序执行之前就初始化并且分配了内存空间。

global_variables.php

注:
1.函数外部声明静态变量意义不大,函数内部声明静态变量受限于作用域,函数外部不能修改函数内部静态变量。
2.引用变量,也是变量,只不过它的值是变量的内存地址。

复制代码 代码如下:
$a = 1;
$b = 2;

php保留字 global和static

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

 代码如下

    $b = $a + $b;
}

<?php
$i = $j = 8;
function global_var() {
   global $j, $b;
   $c = $j = $b = $i = 4;
}
global_var();
echo "i:$i, j:$j b:$b c:$c n"; //i:8, j:4 b:4 c:
?>

Sum();
echo $b;
echo '

函数外和内都有变量$i,但是他们二个是完全不同的变量。函数外的$i是全局变量,该内存空间直到脚本运行结束后才会被释放。函数内的$i是局部变量,程序流经过函数的时候,初始化,退出函数的时候,内存被系统回收,再次调用函数,则再次分配内存空间和回收内存空间。二次分配的内存空间有可能是同一内存地址,也有可能不能同一内存地址。
与$i不同的是$j,通过关键字global将局部变量”转为”全局变量。当调用函数global_var()的时候,并不会重新给$j分配内存空间。同样的,可以在函数外打印$b,却不能打印$c是因为$b是全局变量,不会被销毁。而$c则不能打印,$c已经不存在了,在退出函数就给销毁了。


 代码如下

本文由美狮美高梅官方网站发布,转载请注明来源

关键词: