доступ к ранее включенным (обязательным) методам класса из файла ajax

#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 извините, если это немного больше, чем вы ожидали, но вы задали хороший вопрос.