我认为我的问题可能非常具体。我已经试着找到一些关于它的信息,浏览了很多网站,但都没有成功。我是OO php的新手。我将尝试在没有代码样本的情况下解释问题:
因此,我开发了面向对象的php应用程序。我的Registry类实现了singleton模式(在整个应用程序中只有一个实例),并存储了必须在应用程序的任何部分都可以访问的对象。此时,我需要调用JQueryAJAX来与用户交互,而无需重新加载页面。但是通过AJAX调用php脚本给了我Registry类的另一个实例(当我试图在被调用的php文件中使用Registry时),这个实例肯定是空的(数组中没有对象)。我认为发生这种情况是因为AJAX调用在不同的线程中工作(可能是我错了)。无论如何,使用注册表模式丰富所需功能的方法在哪里?或者可能还有其他方法可以实现它?我知道我可以让我的类静态化,也可以静态地使用对象,但不幸的是我做不到。我也知道全局变量——这不是我的方式。。。请帮忙!
因此,对PHP应用程序的每一个请求都由服务器上的一个单独进程处理。请求之间不共享内存/数据。在这种情况下,对PHP脚本的Ajax请求将无法访问其他请求的信息。
为了处理这个问题,您需要保持您试图以其他方式存储的数据的状态。将其存储在数据库、会话等中
假设您有一个"singleton式"的对象列表,这些对象是商店中可用的项目、库存数量及其元数据。
在伪代码中:
$inventory = array(
"cars" => array(SomeCarObject, AnotherCarObject),
"trucks" => array(SomeTruckObject, AnotherTruckObject)
);
因为它不会根据请求保存在共享内存中,所以每次您需要对此列表进行异步操作时,都需要获取它(从您保存状态的位置)、修改它,然后保存它并做出适当的响应。
你的流程可能看起来像这样:
客户端请求$inventory
=>服务器获取$inventory
的状态,进行填充,重新保存=>将$inventory
发送回客户端。
您可能需要向DB添加一个锁定机制,以指示另一个进程正在使用它,但这是您需要谨慎的,因为这可能会导致其他请求等待修改数据的操作完成后才能完成。您不想引入比赛条件。http://en.wikipedia.org/wiki/Race_condition