Sancho: serialisierte klasseninstanz einlesen

Beitrag lesen

Hi,

public static function load1($name) {
   $dateiInhalt=new Record;
   $dateiInhalt=unserialize(file_get_contents($name));
   return $dateiInhalt;
  }


>   
> mit  
>   
> ~~~php
  

> $record=Record::laod1("dateiname");  
> 

scheint mir o.k.

Naja, ist immer noch etwas viel Aufwand - denn genau den gleichen Effekt hätte ja ein schlichtes:

$record = unserialize(file_get_contents("dateiname"));

Sinnvoller wäre, das Ergebnis der Dateioperation vorher noch zu prüfen, also in PHP 5 etwa:

$path = '/tmp/xyz';  
  
if ($s = file_get_contents($path))  
{  
  $myObj = unserialize($s);  
  
} else {  
  
  throw new Exception("Error reading $path");  
}

Beim Laden eines Objekts über unserialize() musst du allerdings beachten, dass _bestimmte_ Objekteigenschaften anschließend in jedem Fall gesondert wiederhergestellt werden müssen: Ressourcen-Handles und Referenzen. Wenn in einer Objekteigenschaft z.B. eine MySQL-Verbindungskennung gespeichert ist, dann geht diese über serialize/unserialize verloren.

PHP 5 bietet hierfür die abstrakte 'magische Methode' __wakeup(), die automatisch nach einer Objektwiederherstellung über unserialize aufgerufen wird. (Über __sleep() kann zudem festgelegt werden, welche Objekteigenschaften überhaupt serialisiert werden sollen.)

In PHP 4 muss zusätzlich zur Methode auch ihr Aufruf jeweils selbst implementiert werden.

Freundliche Grüße,
Sancho