2008-11-19 169 views
0

编辑:此行为可用query globals重现。PHP5“克隆”如何工作?

我有以下几点:

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

比。

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

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

回答

3

你的代码必须做得很奇怪。 clone用于对象。除非您将对象填充到$ _GET中,否则该代码将导致致命错误(或者在较旧的PHP版本中出现警告)。克隆实际上做了一个对象的浅拷贝,也就是它拷贝了所有的属性,但是如果一个属性是对另一个对象的引用,它将复制引用,而不是克隆另一个对象。

+0

请参阅http://stackoverflow.com/questions/301766/php5-get-variables为什么我' m使用克隆,谢谢。 – EoghanM 2008-11-19 12:35:42

0

我知道这并不真正回答这个问题,但根据您对Roborg的评论,我不认为这是您在其他问题中提到的问题的良好解决方案(here) - 您会最好只要你做

$_SESSION['query_key'] = 'anything' 

$ query_key将是$_SESSION['query_key']参考禁用了register_globals

,所以克隆你把什么进入它会使没有什么区别

编辑

克隆只适用于对象,所以你不能克隆一个字符串。这将导致致命的错误。我想如果你看看你的日志或者将display_errors设置为'On',你会得到一个错误而不是空白页面

+0

感谢大家,禁用register_globals修复它...你的答案并没有解释为什么它在克隆后是空白的..然而..任何想法? – EoghanM 2008-11-19 14:43:53