php语言 百分网手机站

php变量作用域的深入解析(3)

时间:2020-08-05 14:57:13 php语言

php变量作用域的深入解析

  echo $count;

  if ($count < 10) {

  Test ();

  }

  $count--;

  }

  ?>

  注: 静态变量可以按照上面的例子声明。如果在声明中用表达式的结果对其赋值会导致解析错误。

  例子 12-7. 声明静态变量

  复制代码 代码如下:

  Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--><?php

  function foo(){

  static $int = 0; // correct

  static $int = 1+2; // wrong (as it is an expression)

  static $int = sqrt(121); // wrong (as it is an expression too)

  $int++;

  echo $int;

  }

  ?>

  全局和静态变量的引用

  在 Zend 引擎 1 代,驱动了 PHP4,对于变量的 static 和 global 定义是以 references 的方式实现的。例如,在一个函数域内部用 global 语句导入的一个真正的全局变量实际上是建立了一个到全局变量的引用。这有可能导致预料之外的行为,如以下例子所演示的:

  复制代码 代码如下:

  Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--><?php

  function test_global_ref() {

  global $obj;

  $obj = &new stdclass;

  }

  function test_global_noref() {

  global $obj;

  $obj = new stdclass;

  }

  test_global_ref();

  var_dump($obj);

  test_global_noref();

  var_dump($obj);

  ?>

  执行以上例子会导致如下输出:

  复制代码 代码如下:

  NULLobject(stdClass)(0) {}

  类似的行为也适用于 static 语句。引用并不是静态地存储的:

  复制代码 代码如下:

  Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--><?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();

  ?>