创建一个对象数组,然后在不丢失其类的情况下获取对象



我正在尝试做一些数组和对象的实验,以提高我的PHP编程基础。

我想做的是将由我的一个类实例化的对象集合保存在一个文本文件中,以便以后能够获取它们。

我目前的实现是将对象保存在数组中,对数组进行编码并将其保存到JSON文件中。然而,出现的问题是,当我然后去提取对象时,这些对象不再是从我的类派生的对象,而是转换为stdClass对象。

下面是我用来保存对象到文件的方法:

public function store(string $titolo, string $nomeAutore, string $titoloToDoList): void
{
FileChecker::FindOrBuild('Data/Tasks.json', "[]");
$newTask = new Task($titolo, $nomeAutore, $titoloToDoList);
$file = file_get_contents('Data/Tasks.json');
$decodedFile = json_decode($file);
array_push($decodedFile, $newTask->toArray());
file_put_contents('Data/Tasks.json', json_encode($decodedFile));
FileChecker::FindOrBuild('log/log.txt', "Logs: n");
Logger::logTaskStore($nomeAutore, $titoloToDoList);
}

,然后我从文件中提取一个简单的json_decode ()

谁能建议一些替代的方法来保存对象在文本文件中而不丢失类?

编辑:忘了写toArray()代码,就是

public function toArray(): array
{
return get_object_vars($this);
}

有多少人需要在文件中存储稍微不同的内容,就有多少种文件格式。您可以决定哪一个对您的应用程序有意义。

JSON是一种非常简单和灵活的文件格式,并且可以在许多不同的语言之间移植。它没有"阶级"的概念;或"自定义类型"及其"对象"。Type只是一个键值对的列表。(看看当前代码创建的文件,你就会明白了。)

你可以在"之上建立一个文件格式"JSON:也就是说,不是直接存储对象,而是首先构建一个自定义结构,用一种记录类名的方式,可能作为每个对象上的一个特殊键,称为&;__class&;。然后解码,您首先解码JSON,然后循环创建基于您记录的名称的对象。

您在评论中提到PHP的内置serialize方法。当您希望在程序中存储完整的PHP数据以供内部使用时,这可能是一个不错的选择,并且可以愉快地存储对象数组,而无需额外的代码。

在这两种情况下,如果任何人都可以编辑序列化的数据并指定您不希望他们创建的类的名称,请注意安全隐患。unserialize函数有一个选项,列出期望的类名,以避免这种情况,但可能有其他安全问题,因为它的灵活性。

最新更新