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 では参照によるオブジェクトの作成は必要ないという印象を受けました。なぜ私は異なる結果を得ているのですか?