【问题标题】:PHP OOP, jQuery and MVCPHP OOP、jQuery 和 MVC
【发布时间】:2013-05-01 01:59:39
【问题描述】:

我对 PHP OOP 比较陌生,似乎无法通过控制器调用 PHP 类中的函数。我目前的设置是:

  • index.php
  • class.Class1.php
  • functions.controller.php
  • script.js

index.php 中我包含class.Class1.php,创建一个新的Class 对象并使用它的几个方法来输出一些HTML。我想使用 script.js 中的 js 函数(通过使用链接的 onclick 属性调用)与 functions.controller.php 通信,而 functions.controller.php 又会调用方法在 class.Class1.php 中并将数据返回给 script.jsscript.js 将依次在 index.php 上输出 HTML。

问题是我不知道如何使用这些方法来获取该特定对象的数据。当我调用控制器时:

$.ajax({
    type: 'GET',
    url: 'functions/functions.controller.php',
    data: 'r=' + 'h',
    success: function(data){
        $('.showing').html(data);
    }
});

我收到 500 内部服务器错误:

[25-Oct-2011 01:24:06] PHP 警告:include(classes/class.Class1.php) [function.include]:打开失败 流:中没有这样的文件或目录 /Users/Joey/Desktop/root/Test/functions/functions.controller.php on 第 7 行

[25-Oct-2011 01:24:06] PHP 警告:include() [function.include]:打开失败 'classes/class.Class1.php' 用于包含 (include_path='.:/Applications/MAMP/bin/php5.3/lib/php') 在 /Users/Joey/Desktop/root/Test/functions/functions.controller.php on 第 7 行

[2011 年 10 月 25 日 01:24:06] PHP 致命错误:类 'Class1' 不是 在发现 /Users/Joey/Desktop/root/Test/functions/functions.controller.php on 第 9 行

这是controller.php:

include('classes/class.Class1.php');

$in = new Class1;

echo $in->getData();

任何人都可以对此有所了解吗?也欢迎任何其他带有 AJAX 技巧的 PHP OOP MVC。如果需要更多我当前的代码,我很乐意发布。

【问题讨论】:

  • 真的需要直接向控制器发出请求吗???它看起来像某种形式的 MVC,您正在尝试实现。您没有类似的 URL:/my/url,由控制器处理吗?
  • 您的网络服务器日志中针对 500 响应的错误消息是什么?此外,问题顶部列出的文件名与代码中的引用之间似乎存在一些不一致。你能把它清理干净吗?
  • @PeeHaa MVC 不会自动暗示 URL 重写,所以我不会跳到那个假设
  • 我真的不知道我是否需要直接提出请求。就像我之前提到的,我对此很陌生。
  • @Phil 我正在使用 MAMP 在本地运行它,并且正在使用 Chrome 开发人员工具控制台,它只说:错误 500 内部服务器错误。我在哪里可以查看更多内容?

标签: php jquery php-include


【解决方案1】:

PHP 找不到“classes/class.Class1.php”,因为它的父级(“/Users/Joey/Desktop/root/Test/”)不在 PHP 在包含文件时搜索的路径中。在 php.ini.htaccess(如果将 PHP 作为 Apache 模块运行)或 programmatically 中添加“/Users/Joey/Desktop/root/Test/”到包含路径。在最后一种情况下,您可以使用文档根目录。例如,如果文档根是“/Users/Joey/Desktop/root/”(要添加到搜索路径的文件夹的父级):

set_include_path(get_include_path() . PATH_SEPARATOR 
                 . $_SERVER['DOCUMENT_ROOT'] . DIRECTORY_SEPARATOR . 'Test');

如果您将更新包含路径的代码放在要添加的文件夹中的初始化文件中,您可以使用:

set_include_path(get_include_path() . PATH_SEPARATOR . __DIR__);

【讨论】:

    【解决方案2】:

    看起来你的包含路径混淆了。

    我假设你的文件结构实际上是

    index.php
    classes/class.Class1.php
    functions/functions.controller.php
    script.js
    

    要包含functions.controller.php 中的class.Class1.php,您需要先向上遍历一个目录才能离开functions 目录,例如

    // PHP >= 5.3
    require_once __DIR__ . '/../classes/class.Class1.php';
    
    // PHP < 5.3
    require_once dirname(__FILE__) . '/../classes/class.Class1.php`;
    

    【讨论】:

    • 啊,好尴尬:)谢谢你的帮助!
    • 但是这确实解决了我的问题,我现在可以调用该类的方法,但我仍然不得不每次都为该类创建一个新对象,而我想检索现有对象的数据。知道我该如何解决这个问题吗?
    • @Joey:不存在现有对象。每个脚本都随每个请求一起运行。存储在 PHP 变量中的数据不会在处理的请求之后持续存在。扩展有可能存储与它们创建的资源相关的数据。数据可以在$_SESSION 中自动序列化,但一般只能在同一个会话中访问(多个用户不共享会话)。数据库是持久化数据的主要机制。
    猜你喜欢
    • 2011-09-16
    • 2013-01-14
    • 2012-02-24
    • 2016-04-14
    • 2013-07-26
    • 2011-11-19
    • 1970-01-01
    • 2016-04-21
    • 2016-11-28
    相关资源
    最近更新 更多