给力星

Web Developer

重温PHP手册 – 变量和常量

变量

变量默认是传值赋值,也可以用引用赋值,即 $p = &$var。另外有名字的变量才能引用赋值。

变量命名规则的正则表达式:[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]

变量范围

下面代码中的$a在tmp.php中有效。

$a = 1;
include 'tmp.php';

但在用户自定义函数中,局部函数范围被引进,任何用于函数内部的变量按缺省情况控制在局部函数范围内。如下面的脚本不会有输出,这点与C语言不同。

$a = 1; /* global scope */

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

Test();

在PHP中全局变量在函数中使用必须声明为global,如上面的代码应写成:

$a = 1; 

function Test()
{
    global $a;
    echo $a; 
}

Test();

也可以使用 $GLOBALS 数组,$GLOBALS 是超全局变量,即在一个脚本中的全部作用域中都可用,而无需执行 global $variable,如 $_SERVER 变量。

$a = 1; 

function Test()
{
    echo $GLOBALS['a']; 
}

Test();

静态变量

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

/* 多次执行 test(), $a 可以累加 */
function test()
{
    static $a = 0;
    echo $a;
    $a++;
}

静态变量复制时不能使用表达式。如 static $int = 1+2; 是错误的。

可变变量

可变变量即一个变量的变量名可以动态设置和使用,通过多个美元符号实现。不过不适用于静态变量。

$a = 'hello';
$$a = 'world'; // 等价于 $hello = 'world'

// 下面两个都是输出 hello world
echo "$a ${$a}";
echo "$a $hello";

// 美元符号是两个以上
$world = 'end';
echo $$$a;  // 输出 end 

// 不适用于静态变量
$var = "ciao";
static $$var = 0; // parse error.

也可使用花括号来给属性名清晰定界,可用于动态解析。

$a = 'a';
$b = 'b';
$ab = 'a+b';

// 因为 ${'ab'} 是合法的,所以会输出 'a+b'
echo ${$a . $b};

// 结合函数也是可以的
function func() {
    return 'b';
}
echo ${$a. func()}; // 输出 'a+b'

// 还可以这样
$my_func = 'func';
echo $my_func();    // 输出 'b'

常量

常量是一个简单值的标识符(名字),在执行期间不改变。常量默认为大小写,通常以大写的标识符来表示。

  • 常量是通过 define() 来声明,输出时使用其标识符(不用$)就行。
  • 类中的常量要使用 const 来声明。
  • 和超全局变量一样,常量的范围是全局的
  • 常量一旦定义就不能被重新定义或者取消定义
  • 用 get_defined_constants() 可以获得所有已定义的常量列表。
  • 常量在 heredoc 中无法解析。

常量的定义和使用

define('MAX_VALUE', 1);
echo MAX_VALUE;                 // 输出 1
echo constant('MAX_VALUE');     // 也可通过函数获取

class Constants
{
    const MIN_VALUE = 0;      // 用define声明会出错

    public static function getMaxValue() {
        return MAX_VALUE;
    }
    public static function getMinValue() {
        return self::MIN_VALUE;
    }
}

echo Constants::getMaxValue();      // MAX_VALUE 是全局变量
echo Constants::getMinValue();      // 输出 0
echo Constants::MIN_VALUE;          // 也可以这样访问
echo MIN_VALUE;     // 不能输出 0,类中定义的常量,不是全局变量

NOTE

未声明的常量C在 if (C) 中是可以判断通过的。在某些应用场景中应注意。

include('settings.php'); // settings.php 中定义了 define('DEBUG', false);

/* 如果settings.php没有include,或者没有定义 DEBUG,'yes'就会输出。
 * 如果 DEBUG 未定义,甚至 (DEBUG == true) 也是成立的。 */
if (DEBUG) {
    echo 'yes';
}

/* 可使用如下判断 */
if (defined('DEBUG') && DEBUG) {
    echo 'yes';
}

defined() 用于检查常量是否定义,注意加引号; sset()` 用户检查变量。

简洁的种判断常量是否定义,否则定义之。

defined('CONSTANT') or define('CONSTANT', 'SomeDefaultValue');

魔术常量

PHP 向它运行的任何脚本提供了大量的预定义常量,有八个魔术常量它们的值随着它们在代码中的位置改变而改变。例如 __LINE__ 的值就依赖于它在脚本中所处的行来决定。这些特殊的常量不区分大小写。

八个魔术常量 __LINE__ , __FILE__ , __DIR__ , __FUNCTION__ , __CLASS__ , __TRAIT__ , __METHOD__ , __NAMESPACE__

  • __FILE__: 文件的完整路径和文件名。如果用在被包含文件中,则返回被包含文件的路径和文件名。
  • __DIR__: 文件所在的目录。如果用在被包括文件中,则返回被包括的文件所在的目录。它等价于 dirname(__FILE__)。目录中名不包括末尾的斜杠

详细: http://cn2.php.net/manual/zh/language.constants.predefined.php