您的位置:首页 > 编程语言 > PHP开发

php之static和&关键字解析

2016-04-13 15:45 681 查看

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后期静态绑定参看

/article/10591272.html

&取址运算符

在 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)
#}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: