从ajax文件访问以前包含的(必需的)类方法

时间:2011-11-05 02:40:48

标签: php ajax class methods

我是一个php新手,我想知道从前面的ajax文件使用以前定义的类方法的最佳方法。我通过50个或更多的热门问题寻找类似的东西,所以如果以前有人问过我,我很抱歉。

我的项目是使用前端控制器设置的,该控制器调用initialize.php,然后包含我迄今为止为该项目制作的所有类文件,是否现在需要这些类方法/属性(如果这样是超级糟糕然后有人请告诉我一个替代方案:[[]。所以基本上,对于在这个站点上发出的每个请求都会被调用,所有这些类都被定义,两个被立即实例化,这两个是我用于数据库和会话/登录的东西。

我一直在我的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);
?>
最近的并发症现在让我重新思考这种方法。不断加载初始化似乎真的很浪费,但包括/只需要必要的类文件将是最好的屁股痛苦。在这个例子中,我需要包含session,这也需要另外两个类来执行这个登录。

2 个答案:

答案 0 :(得分:2)

您似乎可能希望使用 PHP自动加载机制

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

  

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

     

在PHP 5中,不再需要这样做。您可以定义__autoload函数,如果您尝试使用尚未定义的类/接口,则会自动调用该函数。通过调用此函数,在PHP失败并出现错误之前,脚本引擎将获得加载类的最后机会。

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

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

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

答案 1 :(得分:1)

作为一名新手,您可以很好地掌握控制器等更高级的术语,以及如何正确初始化您的应用程序(即自举)。

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

您的方法与Symfony的方法之间的区别在于Symfony利用了所谓的autoloading。 Symfony将解析查找类文件的某些目录,创建找到的任何类的数组,然后将数组写入flatfile,以便后续请求不会产生再次遍历目录的开销。所以现在当我处理应用程序并且我需要访问一个文件时,我只需要进行调用,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 Framework,更具体地说是Zend_Loader_Autoloader

很抱歉,如果这比你期望的多一点,但你提出了一个很好的问题。