【问题标题】:accessing previously included (required) class methods from an ajax file从 ajax 文件访问以前包含的(必需的)类方法
【发布时间】:2011-11-05 02:40:48
【问题描述】:

我是一个 php 新手,我想知道使用前面的 ajax 文件中先前定义的类方法的最佳方法。我浏览了 50 个或更多的热门问题以寻找与此类似的内容,所以如果之前有人问过这个问题,我深表歉意。

我的项目是使用调用 initialize.php 的前端控制器设置的,该控制器包括我迄今为止为该项目制作的所有类文件,无论现在是否需要这些类方法/属性(如果这非常糟糕,那么有人请告诉我一个替代方案:[[)。所以基本上,对于在该站点上发出的每个请求,都会调用 initialize,所有这些类都已定义,其中两个会立即实例化,这两个是我用于数据库和会话/登录内容的类。

我一直在我的 ajax 文件中这样做:

<?php
// login.ajax.php
require_once 'initialize.php';

$email = $_POST['email'];
$password = $_POST['password'];
$remember = $_POST['remember'];

global $session; // this is instantiated right away every time
$login = $session->login($email, $password);

echo json_encode($login);
?>

最近的并发症让我重新思考这种方法。不断加载初始化似乎真的很浪费,但是只包含/需要必要的类文件充其量只会让人头疼。在此示例中,我需要包含会话,它还需要另外两个类来执行此登录。

【问题讨论】:

  • 我更喜欢自动加载作为答案中的建议。但是,我曾在一个相当大的网站上工作过,我们完全按照您的做法进行操作并加载了所有内容。但是,我们依赖 APC 缓存。 php.net/manual/en/book.apc.php

标签: php ajax class methods


【解决方案1】:

看来你可能希望使用PHP自动加载机制

要查看一些详细信息,请转到the PHP autoloading documentation。你可以在那里读到:

许多编写面向对象应用程序的开发人员为每个类定义创建一个 PHP 源文件。最大的烦恼之一是必须在每个脚本的开头编写一长串所需的包含(每个类一个)。

在 PHP 5 中,这不再是必需的。您可以定义一个 __autoload 函数,以防您尝试使用尚未定义的类/接口时自动调用该函数。通过调用此函数,脚本引擎将获得在 PHP 因错误而失败之前加载类的最后机会。

在您的初始化文件中(或单独的一个,取决于您的设计决定)只需定义__autoload() 函数,该函数将用于包含所需文件:

function __autoload($class_name) {
    include_once $class_name . '.php';
}

这应该可以解决多个需求/包含声明的问题/需要 - 从现在开始,当您实例化某个类并且它不可用时,将调用新定义的函数 (__autoload()) 以包含必要的文件。

【讨论】:

  • 您似乎是说要依赖自动加载我的 ajax 文件?如果是这种情况,自动加载是否足够可靠?就成本而言,完全依赖它而不用担心加载是否有意义?
  • 是的,它是可靠的——它被用于多个 PHP 框架。只需确保它不太复杂(例如,只需定义可用文件列表,因此您无需搜索文件系统即可找到它们)。但我相信,最有效的解决方案是将所有必要的代码(以及必要的代码)存储在单个文件(被调用的文件)中。但我相信你可能不需要这样的东西,你最好只使用自动加载。
【解决方案2】:

对于新手来说,您可以很好地掌握更高级的术语,例如控制器以及如何正确初始化您的应用程序(即引导程序)。

我过去几年的项目都是建立在 Symfony 框架上的,它的作用与您描述的大致相同;控制器确定环境(dev 或 prod 等)然后将根据配置文件引导框架。

您的方法与 Symfony 的方法之间的区别在于 Symfony 利用了所谓的autoloading。 Symfony 将解析某些目录以查找类文件,创建一个包含找到的任何类的数组,然后将数组写入平面文件,这样后续请求就不会产生再次遍历目录的开销。所以现在当我在应用程序上工作并且我需要访问一个文件时,我只需进行调用,PHP 就知道在哪里可以找到它,这要感谢自动加载。

您还可以更进一步,为您的类命名空间,不要与PHP Namespacing 混淆。我的意思是你的类名基于它们在文件系统中的位置。显然,您不想包含完整的文件路径,而是从根目录开始,然后从它开始工作。命名空间也使查找文件变得更加容易。

使用自动加载的类名间距示例:

 // /home/mpurcell/projects/core/lib/CoreLib/Api/Database.php
 // I told php to use /home/mpurcell/projects/core/lib as my root by adding it to include path, and registered the CoreLib_Api_ with the autoloader
 // So my class would look like this:

 class CoreLib_Api_Database
 {
     ...
 }     

 // /home/mpurcell/projects/app/myAwesomeApp/makeMoneyMoney.php

 // As long as the autoloader has been initialized, I can make calls without having to require files
 CoreLib_Api_Database::getDbo($dboKey);

如果您想要自动加载功能而不必在框架上下文中使用它,我建议您使用 Zend 框架,更具体地说是Zend_Loader_Autoloader

Lol 抱歉,如果这超出了您的预期,但您提出了一个很好的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-05
    • 1970-01-01
    • 2015-10-31
    • 1970-01-01
    • 1970-01-01
    • 2013-12-25
    • 2019-01-26
    相关资源
    最近更新 更多