#php #ajax #class #methods
#php #ajax #класс #методы
Вопрос:
я новичок в 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);
?>
недавние осложнения теперь заставляют меня пересмотреть этот подход. постоянная загрузка initialize кажется действительно расточительной, но включение / требование только необходимых файлов классов в лучшем случае было бы занозой в заднице. в этом примере мне нужно было бы включить session, для которого также потребовались бы два других класса для выполнения этого входа.
Комментарии:
1. Я предпочитаю автозагрузку, как указано в ответах. Тем не менее, я работал на довольно большом сайте, где мы сделали именно то, что вы делаете, и загрузили все. Однако мы полагались на кэш APC. php.net/manual/en/book.apc.php
Ответ №1:
Похоже, вы, возможно, захотите использовать механизм автоматической загрузки PHP.
Чтобы увидеть некоторые подробности, пожалуйста, перейдите к документации по автозагрузке PHP. Вы можете прочитать там, что:
Многие разработчики, пишущие объектно-ориентированные приложения, создают один исходный файл PHP для определения класса. Одной из самых больших неприятностей является необходимость написания длинного списка необходимых включений в начале каждого скрипта (по одному для каждого класса).
В PHP 5 в этом больше нет необходимости. Вы можете определить функцию __autoload, которая автоматически вызывается в случае, если вы пытаетесь использовать класс / интерфейс, который еще не был определен. Вызывая эту функцию, скриптовому движку предоставляется последний шанс загрузить класс, прежде чем PHP завершит работу с ошибкой.
В вашем файле инициализации (или отдельном, в зависимости от ваших дизайнерских решений) просто определите __autoload()
функцию, которая будет использоваться для включения необходимых файлов:
function __autoload($class_name) {
include_once $class_name . '.php';
}
Это должно решить проблему / необходимость в объявлениях нескольких требований / включений — с этого момента, когда вы создаете экземпляр некоторого класса, а он недоступен, для включения необходимых файлов будет вызываться вновь определенная функция ( __autoload()
).
Комментарии:
1. кажется, вы предлагаете полагаться на автозагрузку для моих ajax-файлов? если это так, достаточно ли надежна автозагрузка и имеет ли смысл с точки зрения затрат полагаться исключительно на это, а не беспокоиться о загрузке вообще?
2. Да, он надежен — он используется в нескольких PHP-фреймворках. Просто убедитесь, что это не слишком сложно (например, просто определите список доступных файлов, чтобы вам не нужно было искать их в вашей файловой системе). Но наиболее эффективным решением, я считаю, является хранение всего необходимого кода (и только необходимого кода) в одном файле (том, который вызывается). Но я полагаю, что вам, возможно, это не понадобится, и, возможно, для вас будет лучше просто использовать автозагрузку.
Ответ №2:
Будучи новичком, вы неплохо разбираетесь в более сложных терминах, таких как контроллер и как правильно инициализировать ваше приложение (т. Е. начальная загрузка).
Мои проекты за последние несколько лет были построены на платформе Symfony, и она делает почти то же самое, что вы описываете; контроллер определяет среду (dev или prod и т.д.), А затем загружает платформу на основе файлов конфигурации.
Разница между вашим подходом и подходом Symfony заключается в том, что Symfony использует то, что известно как автозагрузка. Symfony проанализирует определенные каталоги в поисках файлов классов, создаст массив любых найденных классов, затем запишет массивы в плоский файл, чтобы последующие запросы не приводили к повторному обходу каталогов. Итак, теперь, когда я работаю над приложением и мне нужен доступ к файлу, я просто делаю вызов, и PHP знает, где его найти, благодаря автозагрузке.
Вы также можете сделать еще один шаг вперед и использовать пространство имен для своих классов, не путать с пространством имен PHP. Я имею в виду, что вы основываете имена своих классов на их расположении в файловой системе. Очевидно, что вы не захотите указывать полный путь к файлу, но начните с корневого каталога, а затем работайте с ним. Пространство имен также значительно упрощает поиск файла.
Пример интервала между именами классов с автозагрузкой:
// /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.
Lol извините, если это немного больше, чем вы ожидали, но вы задали хороший вопрос.