доступ к ранее включенным (обязательным) методам класса из ajax-файла - PullRequest
2 голосов
/ 05 ноября 2011

Я новичок в 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);
?>

недавние осложнения заставляют меня переосмыслить этот подход.Постоянная загрузка инициализации кажется действительно расточительной, но включение / требование только необходимых файлов классов в лучшем случае было бы проблемой в заднице.в этом примере мне нужно будет включить сессию, для которой также потребуется два других класса для входа в систему.

Ответы [ 2 ]

2 голосов
/ 05 ноября 2011

Возможно, вы захотите использовать механизм автозагрузки PHP .

Чтобы увидеть некоторые подробности, перейдите к документации по автозагрузке PHP .Здесь вы можете прочитать, что:

Многие разработчики, пишущие объектно-ориентированные приложения, создают одно определение исходного файла PHP для каждого класса.Одна из самых больших неприятностей заключается в необходимости писать длинный список необходимых включений в начале каждого сценария (по одному для каждого класса).

В PHP 5 это больше не требуется.Вы можете определить функцию __autoload , которая автоматически вызывается в случае, если вы пытаетесь использовать класс / интерфейс, который еще не определен.Вызывая эту функцию, скриптовому механизму дается последний шанс загрузить класс, прежде чем PHP выйдет из строя с ошибкой.

В вашем файле инициализации (или отдельном, в зависимости от ваших проектных решений) просто определите __autoload() функция, которая будет использоваться для включения необходимых файлов:

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

Это должно решить проблему / необходимость множественных объявлений требований / включений - с этого момента, когда вы создаете экземпляр некоторого класса, и он недоступен,Для определения необходимых файлов будет вызвана вновь определенная функция (__autoload()).

1 голос
/ 05 ноября 2011

Для того, чтобы быть новичком, вы хорошо разбираетесь в более сложных терминах, таких как контроллер и как правильно инициализировать ваше приложение (т.е. начальная загрузка).

Мои проекты за последние несколько лет были построены на платформе Symfony, и она делает то же самое, что вы описываете; Контроллер определяет среду (dev или prod и т. д.), затем запускает фреймворк на основе файлов конфигурации.

Разница между вашим подходом и подходом Symfony заключается в том, что Symfony использует преимущества так называемой автозагрузки . 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 Framework, а точнее Zend_Loader_Autoloader .

Извините, если это немного больше, чем вы ожидали, но вы задали хороший вопрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...