在 PHP 中,傳遞物件是很容易的事;我們只需要將物件的狀態封裝起來後,以字串的方式傳遞給另一端的程式還原執行即可。物件的傳遞用途很多,例如我們在 Gearman 中,就可以在 client 把物件當做是 job data 傳遞給 Server 。

註: Gearman 的介紹可以參考拙作:Gearman 心得

以下我們來看看範例。

假設我們有個 Event 類別:

<?php
class Event
{
protected $_name = null;
public function __construct($name)
{
$this->_name = (string) $name;
}
public function getName()
{
return $this->_name;
}
}

然後在 client.php 中我們建立了一個 Event 物件 $event

<?php
require_once 'Event.php';
$event = new Event('test');
file_put_contents('event.txt', serialize($event));

在這邊我們把 $event 實體用 serialize 這個方法序列化,這樣就能把 $event 實體的狀態封裝起來了。

最後我們在 server.php 中還原它:

<?php
require_once 'Event.php';
if (!file_exists('event.txt')) {
exit;
}
$event = unserialize(file_get_contents('event.txt'));
echo $event->getName();

要注意的是,我們必須把 Event 類別的宣告也包含進來,這樣 unserialize 才能正確還原物件。而還原後的 $event 實體,就跟我們在 client.php 建立的 $event 實體的狀態是一模一樣的了。

當然如果物件裡有些狀態是我們所不想傳遞出去時,這時候可以在類別裡定義 __sleep 這個魔術方法來回傳我們想要保留的屬性,而 __wakeup 方法則可以協助我們在 unserialize 後,執行一些初始化的方法;詳細的說明可以參考官方手冊裡 Magic Method 一節。