我正在研究一个从PHP 4迁移到PHP 5.2的非常老的项目,现在我们正在将项目迁移到PHP 5.4。我们想出了一些参考错误。这里有一些示例代码正在扰乱我。为什么在普通对象实例化和通过引用实例化对象之间存在差异?
<?php
class book_shelf
{
protected $_elements = array();
function addBook(&$element){
$this->_elements[] =& $element;
}
function printBooks(){
print(json_encode($this->_elements));
}
}
class book
{
function __construct($title, $author="unknown") {
$this->title = $title;
$this->author = $author;
}
public $title = NULL;
public $author = NULL;
}
function createBookShelf(){
$bookshelf1 = new book_shelf();
for ($i = 0; $i < 3; $i++){
$book1 = new book("Book $i");
$bookshelf1->addBook($book1);
}
$bookshelf1->printBooks();
}
createBookShelf();
?>
我希望这可以创建3本独立的书。但是元素数组中的每个对象最终都指向最后一个变量。另一方面,如果我通过引用创建一本新书,那么一切正常。 (例如$book1 =& new book("Book $i");
)下面是示例代码:
<?php
class book_shelf
{
protected $_elements = array();
function addBook(&$element) {
$this->_elements[] =& $element;
}
function printBooks(){
print(json_encode($this->_elements));
}
}
class book
{
function __construct($title, $author="unknown") {
$this->title = $title;
$this->author = $author;
}
public $title = NULL;
public $author = NULL;
}
function createBookShelf() {
$bookshelf1 = new book_shelf();
for ($i = 0; $i < 3; $i++){
$book1 =& new book("Book $i");
$bookshelf1->addBook($book1);
}
$bookshelf1->printBooks();
}
createBookShelf();
我的印象是,通过在PHP 5.4参考创建对象是没有必要的。任何想法为什么我得到不同的结果?
删除*所有*对对象的引用。对象在默认情况下通过引用进行处理(分配,传递给函数/方法,返回)。 – 2013-02-08 23:34:32
'$ this - > _ elements [] =&$ element;'你期望做什么? – 2013-02-08 23:35:09
从这一行删除&$ this - > _ elements [] =&$ element;'修正了问题 – 2013-02-08 23:45:15