gpt4 book ai didi

php - 使用 PHP 驱动程序将具有私有(private)成员的对象保存到 MongoDb 时出错

转载 作者:可可西里 更新时间:2023-11-01 09:58:15 25 4
gpt4 key购买 nike

谁能告诉我是否有将具有私有(private)成员的 PHP 类保存到 MongoDb 的解决方案?我不断收到以下错误

zero-length keys are not allowed, did you use $ with double quotes?'

我看到至少有两个与同一个问题相关的现有问题没有真正的答案。
Question 1 Question 2

我所有的持久性类都有一个我需要的私有(private)成员,但我对创建一个函数来避免私有(private)成员的必要性不感兴趣,因为这是一个基于实例的类,它具有利用私有(private)成员的多种功能。

网络服务器Apache/2.2.22

PHP 版本 PHP 5.4.6

PHP 扩展 mongo/1.2.6

这将是一个示例实现,请不要批评代码本身,它只是为了说明行为类型,即 $this 的 Save 和基本类型中的 $private 成员:

<?php

class PersistableObject extends AbstractBasePersistableObject
{
public $PublicSubTypeProperty;

public function __construct()
{
parent::__construct();
}

public function GetDalConfigurationFromSubType()
{
//This object is just a wrapper DAL implemented based on
//the php Mongo, MongoDb and MongoCollection objects
return new MongoBasedDal();
}
}


abstract class AbstractBasePersistableObject
{
private $dalRef = null;
public $PublicBaseProperty;

public abstract function GetDalConfigurationFromSubType();

public function __construct()
{
$this->dalRef = $this->GetDalConfigurationFromSubType();
}

public function Save()
{
$this->dalRef->Save($this);
}
}

?>

最佳答案

Can anyone tell me if there is a resolution to saving PHP classes with private members to MongoDb?

正如您从 Google Groups 了解到的那样,问题在于 PHP 驱动程序实际上在保存时忽略了私有(private)变量和 protected 变量。这是驱动程序本身核心中的一个基本问题,因此没有简单的解决方法。正如您所知,Derick 为此创建了一个 JIRA:https://jira.mongodb.org/browse/PHP-624

@harald 实际上说明了解决方法,即创建您自己的 _to_array() 并将其提供给保存函数,不幸的是,这又引发了一个关于如何构建类的基本问题。你必须像这样使用反射:

$reflect = new ReflectionClass(get_class($this));
$class_vars = $reflect->getProperties(ReflectionProperty::IS_PUBLIC | ReflectionProperty::IS_PROTECTED | ReflectionProperty::IS_PRIVATE);

foreach ($class_vars as $prop) {
$doc[$prop->getName()] = $this->{$prop->getName()};
}

然后在保存中使用$doc

然而,您可以通过制作一个预定义的 $schema 数组来稍微改变您的编程以避免反射(或者只是缓存反射的结果以节省资源)您希望保存的所有字段。当您希望按需添加新字段时,您只需让 __set__get 更新内存模式数组即可。通过这种方式,您可以完全避免反射,只需获取模式数组及其值即可。

这是很多框架用来解决这个问题的方法,包括 Lithium、Yii、Kohona、CakePHP 等等。

关于php - 使用 PHP 驱动程序将具有私有(private)成员的对象保存到 MongoDb 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13638839/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com