代码之家  ›  专栏  ›  技术社区  ›  Arno van Oordt

存储在MonogoDB中时将类实例转换为字符串

  •  0
  • Arno van Oordt  · 技术社区  · 1 年前

    在PHP中,我有一些自定义类(例如MediaUid)的实例,我想将其作为字符串存储在MongoDB中的某个嵌套文档中。

    我知道我可以 Serializable 类序列化并存储为序列化对象,如下面的示例所示,但是否也有一种方法可以将其自动存储为字符串(因此在插入数据库之前无需手动强制转换)?

    <?php
    
    namespace Domain\Media\Models;
    
    use MongoDB\BSON\Serializable;
    
    class MediaUid implements Serializable
    {
    
        public readonly string $val;
    
        public function __construct(string $val)
        {
            $this->val = $val;
        }
    
        public function __toString()
        {
            return $this->val;
        }
    
        public function bsonSerialize()
        {
            return ['val' => $this->val];
        }
    
    }
    

    换句话说,对于这个班 bsonSerialize 自实现以来被调用 可序列化 ,但是有没有办法让它调用 __toString 相反

    1 回复  |  直到 1 年前
        1
  •  0
  •   Markus Zeller    1 年前

    __toString() 实现将实例强制转换为字符串( Stringable 接口)。它与 Serializable

    class MediaUid implements Stringable
    {
        public function __toString(): string
        {
            return json_encode(['val' => $this->val]);
        }
    }
    
    $mediaUid = new MediaUid('abcdef');
    echo $mediaUid;
    $bson = (string) $mediaUid;
    

    给你绳子

    {"val":"abcdef"}
    

    更好的选择是实施 JsonSerializable 。这样可以更好地封装数据,并且您明确表示您想要一个JSON,无论它存储在里面是什么。

    class MediaUid implements JsonSerializable
    {
        public function jsonSerialize()
        {
            return ['val' => $this->val];
        }
    }
    
    $mediaUid = new MediaUid('abcdef');
    echo json_encode($mediaUid);