【问题标题】:PHP, jQuery and Ajax Object OrientationPHP、jQuery 和 Ajax 面向对象
【发布时间】:2011-02-02 14:45:33
【问题描述】:

我是一位经验丰富的程序员,第一次接触 PHP 和 Ajax,但在弄清楚如何将面向对象的 PHP 合并到我的 ajax webapp 中时遇到了一些麻烦。

我有一个管理页面 (admin.php),它将根据用户在管理页面上选择的表单从 XML 文件加载和写入信息 (info.xml)。我决定使用一个对象(ContentManager.php)来管理 XML 文件到磁盘的加载和写入,即:

class ContentManager{

 var $xml_attribute_1
 ...

 function __construct(){
    //load the xml file from disk and save its contents into variables
    $xml_attribute = simplexml_load_file(/path/to/xml)
 }
 function get_xml_contents(){
    return xml_attribute;
 }
 function write_xml($contents_{
 }
 function print_xml(){
 }    
}

我像这样在 admin.php 中创建 ContentManager 对象

<?php
include '../includes/CompetitionManager.php';
$cm = new CompetitionManager()
?>
<script>
  ...all my jquery
</script>
<html>
  ... all my form elements
</html>

所以现在我想使用 AJAX 来允许用户通过 ContentManger 应用程序使用这样的接口 (ajax_handler.php) 从 XML 文件中检索信息

<?php
  if(_POST[]=="get_a"){

  }else if()
  }
  ...
 ?>

我明白如果我不使用对象,这将如何工作,即hander php 文件将根据.post 请求中的变量执行特定操作,但是通过我的设置,我看不出我怎么能获取对我在 ajax_handler.php 文件中的 admin.php 中创建的 ContentManager 对象的引用?也许我对 php 对象范围的理解是有缺陷的。

无论如何,如果有人能理解我正在尝试做的事情,我将不胜感激!

【问题讨论】:

    标签: php jquery ajax oop


    【解决方案1】:

    将每个 ajax 调用视为一个单独的请求。如果在特定请求的生命周期中您没有实例化 ContentManager,则该对象不存在。如果您想在多个请求之间使用单个对象,请将其序列化为会话并在请求生命周期的早期对其进行反序列化。

    【讨论】:

    • 好吧,我已经在 admin.php 文件的开头实例化了 ContentManager 对象,所以它应该在用户与表单的交互过程中仍然存在?
    • 不...如果它是一个 ajax 调用,它是一个完全独立的 http 请求。浏览器没有“回发”这一事实可能会引起一些混乱,但 ajax 请求遵循与页面请求或表单回发相同的生命周期。如果这有点难以可视化,请下载适用于 Firefox 的 Live HttpHeaders 插件,然后观察页面上从客户端到服务器的 ajax 请求。
    • hmmm,也许我对这个的理解有些偏差。我知道当您执行 Ajax 请求时,它是一个全新的 http 调用,因此生命周期很短,但是如果加载了 admin.php,然后我创建了 php 对象,那么该 php 对象是否不会无限期地驻留在服务器上,直到引用丢失了,即直到用户离开页面?这意味着在此期间任何 Ajax 请求都可以访问该对象
    • 没有。将您的服务器和客户端视为完全断开连接。当页面在服务器上完成渲染时,它被发送到客户端并且一切都被破坏了。为了在请求之间存在任何内容,您必须使用某种内存或文件存储,并在后续请求中将对象拉出。因为你在 php 中工作,那将是 $_SESSION
    • 啊,我明白了,我认为对象在服务器上仍然存在。似乎 PHP 中的对象有点麻烦,只是按程序来做会更容易吗?对会话变量中的对象进行编码是否正常且安全?
    【解决方案2】:

    我不知道这是否是您需要的,好吧,就这样吧。有一个 PHP 文件来处理所有的表单提交。例如:proc.php 或 ACTION="proc.php" 中的类似内容。在 proc.php 内部,根据提交的参数,进行函数调用。您可能应该做的另一件事是在类文件本身的末尾创建类(对象)的实例,从而避免每次都检查对象是否已实例化。 如有必要,在调用对象函数之前使用global $objectname

    【讨论】:

    • 我实际上已经在 ajax_handler.php 中做到了。问题是 ContentManager php 类是一个单独的文件,单独实例化为 ajax_handler.php
    • 只需在 ajax_handler.php 中包含 contentmanager 文件而不是 admin.php 并使用该对象。是这样还是我在这里误解了什么?
    猜你喜欢
    • 2013-01-19
    • 2011-02-27
    • 2016-12-01
    • 2012-02-10
    • 2014-08-25
    • 1970-01-01
    • 1970-01-01
    • 2015-04-24
    • 1970-01-01
    相关资源
    最近更新 更多