2012-02-12 4 views
1

PHP 5.3.8を使用しています。 Adoptionインスタンスをシリアライズ複数のオブジェクトをPHPでファイルにシリアライズすると、シリアル化できませんか?

私は2つの機能を実装しようとしてる

save($adoption)は、区切り文字を追加し、その後、内容が上explode() S、テキストファイルを開く、テキストファイルの末尾に追加して、loadAdoptions()デリミタであり、unserialize()■forループ内の各オブジェクトが配列explode()の内容を返してから返され、その後Display()が呼び出されます。

ここに私の問題を再現する最短の形式です:Display()が呼び出されたライン38、オン

<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> 

Fatal error: Call to a member function Display() on a non-object

+0

してください – deceze

+1

デリミタは、オブジェクトのシリアル化されたバージョンのどこにも表示されませんか? – rdlowrey

+0

@deceze私の謝罪、私はそれは比較的だったので、私は考えました大規模なサンプル、それはより多くの裁判所かもしれませんここにすべてダンプするのではなく、別の場所にホストすること。 – NobodyNothing

答えて

2

かなりの数回は、あなたは、変数の前オフ$を見逃しています。また、あなたが$this->dogを使用する必要がDisplay()に犬の名前を取得する方法(からクラスのメンバ変数にアクセスするために

の作業ソース:。

<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

これは最初のものを正しく読み込みますが、2番目のレコードは失敗します。 EG: 'Retrieved Data' ' Count:2' 'Scruffles' ' Error Reading Record.' 何回実行しても同じ出力を生成します。 – NobodyNothing

+0

2番目のレコードは空であるため、テキストファイルには保存されません.Option:O:8: ":1:{s:4:" name "; s:9:" Scruffles ";}} ' - これは、シリアライズされたオブジェクトにデリミタを加えたものです。 ''で爆発すると、2つの要素が返されます。 1つはあなたのオブジェクトであり、もう1つはその後の空のスペースです。 – Joe

+0

しかし、スクリプトが2回目に実行されると、表示が呼び出される前に別のオブジェクトを追加する必要がありますが、そうでないようです。 – NobodyNothing

0

$curAdoptionの方法Display()を持っていません...

+0

これは、 'unoption'クラスではないことを意味します。これは、' unserialize() 'が失敗したことを意味しますが、なぜですか? – NobodyNothing

関連する問題