0

编辑:此行为可通过查询全局变量重现。

我有以下内容:

  $_SESSION['query_key'] = $_GET['query_key'];
  print($query_key);

比。

  $_SESSION['query_key'] = clone $_GET['query_key'];
  print($query_key);

前者打印出 $query_key 的值,而后者什么也不打印。克隆的这种奇怪的副作用是什么?

4

2 回答 2

3

你一定在用你的代码做一些很奇怪的事情。 克隆用于对象。除非您将对象填充到 $_GET 中,否则该代码将导致致命错误(或旧 PHP 版本中的警告)。

@Michael Haren - clone 实际上对一个对象进行了浅拷贝,也就是说,它复制了所有属性,但是如果一个属性是对另一个对象的引用,它将复制引用,而不是克隆另一个对象。

于 2008-11-19T12:15:44.127 回答
0

我知道这并没有真正具体回答这个问题,但根据您对 Roborg 的评论,我认为这不是您在其他问题(此处)中提到的问题的好解决方案 - 您最好禁用 register_globals

只要你这样做

$_SESSION['query_key'] = 'anything'

$query_key 将是对 的引用 $_SESSION['query_key'],因此克隆您放入其中的内容不会有任何区别

编辑

克隆仅适用于对象,因此您无法克隆字符串。这将导致致命错误。我认为,如果您查看日志或将 display_errors 设置为“开”,您将收到错误而不是空白页

于 2008-11-19T13:29:16.210 回答