2012-12-05 140 views
1

我已经继承了一些我需要对其进行重大更改的PHP代码。我知道用PHP可以序列化一个对象,并将页面之​​间的序列化文本作为FormData传递。在我继承的代码中,他们已经做到了,但是这造成了一些可维护性问题。我想知道如果采取这种方法甚至是一个好主意。在PHP页面,IDE和将对象传递给其他类时传递对象

例如...

当用户打开PageA.php创建以下:

$expensiveObj = new ExpensiveClass($id); 

$expensiveObj被串行化,并将所得文本存储在与所述一个div以下:

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

PageA.php负载,ajax调用是PageB.php。 div的内容作为后期变量传递到PageB.php。在PageB.php下面的代码unserializes对象:

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

的字段和$expensiveObj的方法现在是到PHP访问。我现在遇到的问题是

  • 因为$expensiveObj确定PageB.php作为类ExpensiveClass的一个实例,则IDE不知道的ExpensiveClass领域和功能都可用。我无法进行自动完成,也无法在IDE中查找可用的功能。另外IDE不能捕捉潜在的问题。另一个开发者专门在VI中工作,所以他从不关心。

  • PageB.php需要重新考虑因素。有一些视图,商业和控制器逻辑都发生在这个页面中,我宁愿创建几个类,但是我遇到了一个问题,我不知道如何将$expensiveObj传递给一个类。

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

最后,以这种方式绕过物体甚至是一个好主意,还是应该考虑更大的重新因子?

+0

[Sessions](http://us3.php.net/manual/en/book.session.php)。就这些。 – Sammitch

+0

@Sammitch我不确定使用会话会解决我列出的问题。这只是以更持久的方式传递数据/对象的另一种方式。但是,如果您想将您的评论扩展为答案,我肯定会考虑您要说的话。如果可能, – Bill

+0

会话+1,两个页面都可以开始同一会话。 –

回答

1

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

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

+0

我同意这是更好的方法,但我可以理解其他开发人员在他所做的背后的理性。创建新对象的问题在于,在这种特定情况下,该操作相当昂贵且耗时。多次打击资源是我宁愿避免的。 – Bill

+0

我假设有一些昂贵的数据库查询或类似的东西。在这种情况下,你可以使用某种缓存,例如memcache或将其作为JSON存储到文件系统和“ExpensiveClass”的构造函数中,您可以检查是否所有数据都被缓存。 –