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) #}
相关文章推荐
- php异常处理
- java模拟PHP的pack和unpack类
- phpstorm invalid descendent file name
- php远程下载类分享
- PHP-迭代器与序列化
- phpword的几个坑
- PHP 实现商品的无限规格实现思路
- ThinkPHP之OAuth2.0环境搭建
- Thinkphp和onethink实现微信支付插件
- php中JSON的使用与转换
- thinkphp3.2加载模块错误
- php自定义分页
- php图形图像操作
- PHP:将一个字符创插入到另一个字符串的指定位置
- 用PHP抓取淘宝商品的用户晒单评论+图片实例
- php上传绕过
- ViewPager 如何得到当前的Fragment (使用FragmentPagerAdapter)
- php中的日期和时间
- PHP MSSQL 分页实例
- Windows下搭建PHP开发环境