static关键字
static关键字的一个重要特性是静态变量,静态变量仅在局部函数域中存在,但当程序执行离开此作用域时,其值并不丢失。
<?php function test() { static $a = 0; echo $a; $a++; } ?> test();#0 test();#1 #变量 $a 仅在第一次调用 test() 函数时被初始化
静态变量与递归函数 function test() { static $count = 0; $count++; echo $count; if ($count < 10) { test(); } $count--; echo $count; } test();#输出为:1 2 3 4 5 6 7 8 9 10 9 8 7 6 5 4 3 2 1 0
- 类中的static,即静态属性和静态方法
- 静态属性:可以通过类来访问,不能通过类的对象来访问。静态属性只能被初始化为文字或常量,不能使用表达式。所以可以把静态属性初始化为整数或数组,但不能初始化为另一个变量或函数返回值,也不能指向一个对象。
- 静态方法:可以通过类来访问,也可以通过类的对象来访问。由于静态方法不需要通过对象即可调用,所以伪变量 $this 在静态方法中不可用。
<?php
class Test{
public static $a1 = '123';
public static function f1()
{
echo self::$a1;
}
}
echo Test::$a1; #123
echo Test::f1();#123
$test = new Test();
echo $test->a1;#Notice: Undefined property: Test::$a1
echo $test->f1();#123
3.static后期静态绑定参看
http://blog.csdn.net/ma199385/article/details/50639276
&取址运算符
在 PHP 中引用意味着用不同的名字访问同一个变量内容,变量名和变量内容是不一样的, 因此同样的内容可以有不同的名字。
<?php $a =& $b;$a 和 $b 指向了同一个变量内容 function foo(&$var) { } foo($c); #$c被创建,指向null #如果对一个未定义的变量进行引用赋值、引用参数传递或引用返回,则会自动创建该变量。
引用传递,一个变量通过引用传递给函数,这样该函数就可以修改其参数的值
<?php function foo(&$var) { $var++; } $a=5; foo($a);#6 ?>
可以进行引用传递的方式
- 变量,例如 foo($a)
- New 语句,例如 foo(new foobar())
- 引用返回
引用返回,引用返回用在当函数返回值应该被绑定在一个变量上面时,
<?php class foo { public $value = 42; public function &getValue() { return $this->value; } } $obj = new foo; $myValue = &$obj->getValue();#如果不加&,即为普通调用 $obj->value = 2; echo $myValue; #2 $myValue = 3; echo $obj->value; #3 #此时$myvalue和类中的属性$value指向同一个变量内容,
取消引用,当 unset 一个引用,只是断开了变量名和变量内容之间的绑定。这并不意味着变量内容被销毁了
<?php $a = 1; $b =& $a; unset($a); #不会 unset $b,只是 $a。
引用定位
global 引用,当用 global $var 声明一个变量时实际上建立了一个到全局变量的引用。和下面的代码作用相同。
<?php $var =& $GLOBALS["var"]; ?>
$this
在一个对象的方法中,$this 永远是调用它的对象的引用。
全局和静态变量的引用
对于变量的 static 和 global 定义是以引用的方式实现的,所以如果给static或者global的变量赋值一个引用,那么此变量将不再是global和static类型的了。
<?php
function test_global_ref() {
global $obj;
$obj = &new stdclass;此时$obj不再是全局变量,它由指向全局的变量内容变为指向局部对象。所以在函数外部调用$obj为null
}
function test_global_noref() {
global $obj;
$obj = new stdclass;
}
test_global_ref();
var_dump($obj); #NULL
test_global_noref();
var_dump($obj);#object(stdClass)(0) {
}
?>
<?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: NULL
#Static object: NULL
#Static object: NULL
#Static object: object(stdClass)(1) {
#["property"]=>
#int(1)
#}