0

我有一个类,它只MongoDate用一个构造函数和一个重载的__toString().

class MyClass extends MongoDate
{
    public function __construct( $param )
    {
        if( is_a( $param, 'MongoDate' ) )
        {
            parent::__construct( $param->sec, $param->usec );
        }
        else if ( is_a( $param, 'DateTime' ))
        {
            parent::__construct( $param->getTimestamp() );
        }
        else if( is_string( $param ) )
        {
            $datetime = new DateTime( $param );
            parent::__construct( $datetime->getTimestamp() );
        }
        else
        {
            parent::__construct(); 
        }   
    }

    public function __toString()
    {
        return date( 'D, d M Y H:i', $this->sec );
    }
}

此类的实例构造良好,并且在存储之前具有正确的值。

此类存储在 MongoDB 中时具有以下形式:

{ "sec" : 1387576800, "usec" : 0 }

而不是我在使用 MongoDate 存储值时拥有的这个:

ISODate("2013-12-30T22:00:00Z")

存储值的代码,在两种情况下都使用,其中$date是 aMyClass或 a MongoDate

$query = array( '_id' => $item_id );
$update = array( '$set' => array( $date_field => $date ) );
$collection->update( $query, $update );

为什么从 MongoDate 继承的类没有存储为 MongoDate 是(作为 ISODate 对象),我该如何解决?

4

1 回答 1

1

目前,PHP 驱动程序仅在 BSON 序列化期间检查对象的类名(参见此处clazz == mongo_ce_Date的比较逻辑)。

将来可能会更改为使用 PHP 核心instanceof_function()(from zend_operators.h) 并接受任何扩展核心 MongoDate 类的对象;但是,一个问题是继承类可能会更改其对内部属性的使用,这些属性在序列化期间读取。在将扩展类转换为 BSON 时,这可能会导致意外行为。

您可以在PHP-954中跟踪此功能。

于 2014-01-02T19:03:30.357 回答