PHP变量是什么?
PHP 中的变量用一个美元$
符号后面跟变量名来表示。变量名是区分大小写的。要将变量转换为变量变量,需要在变量前面加上$
。
变量名与 PHP 中其它的标签一样遵循相同的规则。一个有效的变量名由字母或者下划线开头,后面跟上任意数量的字母,数字,或者下划线。按照正常的正则表达式,它将被表述为:’[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*‘。
1 2 3 4 5 6 7 8 9 | <?php $var = 'sky8g'; $Var = 'com'; echo "$var, $Var"; // 输出 "sky8g, com" $4site = 'not yet'; // 非法变量名;以数字开头 $_4site = 'not yet'; // 合法变量名;以下划线开头 $i站点is = 'mansikka'; // 合法变量名;可以用中文 ?> |
虽然在 PHP 中并不需要初始化变量,但对变量进行初始化是个好习惯。未初始化的变量具有其类型的默认值 – 布尔类型的变量默认值是 FALSE
,整形和浮点型变量默认值是零,字符串型变量(例如用于 echo 中)默认值是空字符串以及数组变量的默认值是空数组。
未初始化变量的默认值
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | <?php // Unset AND unreferenced (no use context) variable; outputs NULL var_dump($unset_var); // Boolean usage; outputs 'false' (See ternary operators for more on this syntax) echo($unset_bool ? "true\n" : "false\n"); // String usage; outputs 'string(3) "abc"' $unset_str .= 'abc'; var_dump($unset_str); // Integer usage; outputs 'int(25)' $unset_int += 25; // 0 + 25 => 25 var_dump($unset_int); // Float/double usage; outputs 'float(1.25)' $unset_float += 1.25; var_dump($unset_float); // Array usage; outputs array(1) { [3]=> string(3) "def" } $unset_arr[3] = "def"; // array() + array(3 => "def") => array(3 => "def") var_dump($unset_arr); // Object usage; creates new stdClass object (see http://www.php.net/manual/en/reserved.classes.php) // Outputs: object(stdClass)#1 (1) { ["foo"]=> string(3) "bar" } $unset_obj->foo = 'bar'; var_dump($unset_obj); ?> |
变量的变量
变量就是可以存储值的一个容器,变量可以通过动态变量名访问。变量的名称可以存储在另一个变量中,允许动态地访问它。这些变量被称为变量变量。
例如:
1 2 3 4 5 6 7 8 9 10 11 12 13 | $variableName = 'foo'; $foo = 'bar'; //下面都是等价的,所有输出“bar”: echo $foo; echo ${$variableName}; echo $$variableName; //similarly, $variableName = 'foo'; $$variableName = 'bar'; // 下面的语句也将输出“bar” echo $foo; echo $$variableName; echo ${$variableName}; |
变量变量对映射函数/方法调用很有用:
1 2 3 4 5 | function add($a, $b) { return $a + $b; } $funcName = 'add'; echo $funcName(1, 2); // outputs 3 |
这在PHP类中特别有用:
1 2 3 4 5 6 7 8 9 | class myClass { public function __construct() { $functionName = 'doSomething'; $this->$functionName('Hello World'); } private function doSomething($string) { echo $string; // Outputs "Hello World" } } |
下面的这个这个是可以的,但不需要把$variableName
放在{}
之间:
1 | ${$variableName} = $value; |
下面的例子是等效的输出“baz”:
1 2 3 4 | $fooBar = 'baz'; $varPrefix = 'foo'; echo $fooBar; // Outputs "baz" echo ${$varPrefix . 'Bar'}; // Also outputs "baz" |
只有当变量的名称本身是一个表达式时,才强制使用{}
,如下所示:
1 | ${$variableNamePart1 . $variableNamePart2} = $value; |
尽管如此,还是建议始终使用{}
,因为它更具可读性。
虽然不建议这样做,但有可能会导致以下行为:
1 | $$$$$$$$DoNotTryThisAtHomeKids = $value; |
PHP5与PHP7变量的差异
在使用{}
or()
的另一个原因是PHP5和PHP7处理变量的方式略有不同,这在某些情况下会导致不同的结果。
在PHP7中,动态变量、属性和方法将严格按照从左到右的顺序进行评估,而不是像PHP5中那样混合使用特殊情况。下面的示例显示了评估顺序是如何变化的。
Case 1 : $$foo[‘bar’][‘baz’]
1 2 | PHP5 表示为: ${$foo['bar']['baz']} PHP7 表示为: ($$foo)['bar']['baz'] |
Case 2 : $foo->$bar[‘baz’]
1 2 | PHP5 表示为: $foo->{$bar['baz']} PHP7 表示为: ($foo->$bar)['baz'] |
Case 3 : $foo->$bar[‘baz’]()
1 2 | PHP5 表示为: $foo->{$bar['baz']}() PHP7 表示为: ($foo->$bar)['baz']() |
Case 4 : Foo::$bar[‘baz’]()
1 2 | PHP5 表示为: Foo::{$bar['baz']}() PHP7 表示为: (Foo::$bar)['baz']() |