2

我继承了一些我需要对其进行重大更改的 PHP 代码。我知道使用 PHP 可以序列化一个对象,并将页面之​​间的序列化文本作为 FormData 传递。在我继承的代码中,他们就是这样做的,但这会产生一些可维护性问题。我想知道采用这种方法是否是一个好主意。

例如 ...

当用户打开PageA.php时,会创建以下内容:

$expensiveObj = new ExpensiveClass($id);

然后$expensiveObj将其序列化,并将生成的文本存储在 div 中,其中包含以下内容:

<div id="expensiveObj"><?php echo strtr(base64_encode(serialize($expensiveObj)), '+/=', '-_,');?></div>

PageA.php加载时,会对PageB.php进行 ajax 调用。div 的内容作为 post 变量传递给PageB.php。在PageB.php中,以下代码反序列化对象:

$expensiveObj = unserialize(base64_decode(strtr($_POST['expensiveObj'], '-_,', '+/=')));  

$expensiveObjPHP 现在可以访问的字段和方法。我遇到的问题是

  • 因为在PageB.php$expensiveObj中没有将 标识为 Class 的实例,所以 IDE 不知道 的字段和函数是否可用。我不能自动完成,也不能在 IDE 中查找可用的功能。此外,IDE 无法捕获潜在问题。另一个开发人员专门在 VI 中工作,所以他从不在乎。ExpensiveClassExpensiveClass

  • PageB.php需要重构。这个页面中发生了视图、业务和控制器逻辑,我更愿意创建几个类,但是我遇到了一个问题,我不知道如何将它们传递$expensiveObj给一个类。

我的问题是,有没有办法将一个对象传递给一个类?有没有办法通知 IDE 传入的 post 变量确实是 的一个实例ExpensiveClass

最后,以这种方式传递对象甚至是一个好主意,还是我应该考虑更大的重构?

4

1 回答 1

2

直接在 HTML 中存储对象绝不是一个好主意,因为它可以很容易地被客户端更改。在 PHP 中更常见的是根据给定的参数在每个请求上创建新对象。我看到你正在使用 初始化你的对象$id,所以你可以在请求之间传递这个 id。将数据存储到会话也不是最佳实践,会话应用于特定于会话的数据,例如登录用户等。

如果对象的创建非常昂贵,您可以使用缓存,例如memcache,一些外部或只是编写您自己的,例如在文件系统或数据库中以 JSON 格式存储数据。

于 2012-12-05T22:06:31.293 回答