Сериализация нескольких объектов в файл в PHP, не можете десериализовать? - PullRequest
1 голос
/ 12 февраля 2012

Использование PHP 5.3.8.

Я пытаюсь реализовать две функции: save($adoption), который сериализует экземпляр Adoption, добавляет разделитель, затем добавляет его в конец текстового файла, и loadAdoptions(), который открывает текстовый файл explode() s содержит содержимое разделителя, и unserialize() s каждый объект в цикле for просматривает содержимое возвращаемого массива explode(), затем вызывает Display() для них.

Вот кратчайшая форма, воспроизводящая мою проблему:

<html><head><title>Request Processed</title></head><body>
<?php
class Dog {
    var $name; 
}

class Adoption
{
    var $dog;

    function Display()
    {
        echo $dog->name;
    }
}

function save($adoption)
{
    file_put_contents("../adoptions/adoptions.txt", (serialize($adoption)."<!-- E -->"));
 }

function loadAdoptions()
{
    $filename = '../adoptions/adoptions.txt';
    if (file_exists($filename)) 
    {
        $datain = file_get_contents($filename);
        $out = explode("<!-- E -->", $datain);

        echo "<br /><u>Retrieved Data</u><br />";
        $count = count($out);
        echo 'Count: '.$count;

        for ($i = 0; i < $count; $i++)
        {
            $curAdoption = unserialize($out[i]);
           if (curAdoption)
                echo $curAdoption->Display();
            else
                echo 'Error Reading Record.';
            echo '<br />';
        }

    }
}

$newDog = new Dog();
$newDog->name = "Scruffles";
$newAdoption = new Adoption();
$newAdoption->dog = newDog;
save(newAdoption);
loadAdoptions();
?>
</body></html>

В строке 38, где вызывается Display(), Fatal error: Call to a member function Display() on a non-object

Ответы [ 2 ]

3 голосов
/ 12 февраля 2012

Несколько раз вы пропустили $ в начале переменной. Также для доступа к переменной-члену класса из метода (для получения имени собаки в Display() вам необходимо использовать $this->dog.

Рабочий источник:

<html><head><title>Request Processed</title></head><body>
<?php
class Dog {
    var $name; 
}

class Adoption
{
    var $dog;

    function Display()
    {
        echo $this->dog->name;
    }
}

function save($adoption)
{
    file_put_contents("../adoptions/adoptions.txt", (serialize($adoption)."<!-- E -->"));
 }

function loadAdoptions()
{
    $filename = '../adoptions/adoptions.txt';
    if (file_exists($filename)) 
    {
        $datain = file_get_contents($filename);
        $out = explode("<!-- E -->", $datain);

        echo "<br /><u>Retrieved Data</u><br />";
        $count = count($out);
        echo 'Count: '.$count;

        for ($i = 0; $i < $count; $i++)
        {
            $curAdoption = unserialize($out[$i]);
           if ($curAdoption)
                echo $curAdoption->Display();
            else
                echo 'Error Reading Record.';
            echo '<br />';
        }

    }
}

$newDog = new Dog();
$newDog->name = "Scruffles";
$newAdoption = new Adoption();
$newAdoption->dog = $newDog;
save($newAdoption);
loadAdoptions();
?>
</body></html>
0 голосов
/ 12 февраля 2012

$curAdoption не имеет метода Display() ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...