PHP5'克隆'如何工作?

时间:2008-11-19 11:59:47

标签: php clone

编辑:此行为可以使用query globals重现。

我有以下内容:

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

Vs以上。

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

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

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:0)

我知道这并没有特别回答这个问题,但根据你对Roborg的评论我不认为这是你在其他问题中提到的问题的一个很好的解决方案(here) - 你最好禁用register_globals

一旦你

$_SESSION['query_key'] = 'anything'

$ query_key将是对$_SESSION['query_key']的引用,因此克隆你所添加的内容将没有任何区别

修改

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