#php #function
#php #функция
Вопрос:
Я новичок в функциях, и я, вероятно, делаю это не так хорошо, как мог бы, поэтому мог бы воспользоваться некоторой помощью в этом. Я извлекаю информацию о запасах из API веб-сайтов. Вся извлекаемая информация выполняется с несколькими страницами .php, и у меня есть один файл, который включает все необходимые страницы. Итак, у меня есть что-то вроде этого: pullBalanceSheet.php для всех балансовых данных pullIncomeStatement.php для всех данных о доходах и т.д. имеется 10 страниц. Все страницы могут запускаться независимо друг от друга и были созданы таким образом, чтобы упростить тестирование каждого вызова API. У меня есть главная страница (pullData.php ), который содержит необходимые включения для каждой страницы, чтобы эффективно запускать все страницы как одну страницу. Я надеюсь, что это имеет смысл.
Некоторые из моих страниц содержат функцию, и именно здесь я, вероятно, делаю это не лучшим образом, но страницы работают для извлечения правильных данных. Эти страницы содержат ежеквартальную финансовую информацию за последние 5 лет. Проблема в том, что каждая компания по-разному определяет квартальные финансовые даты. Итак, допустим, сейчас январь 2019 года, и некоторые компании ежеквартально будут указывать 2 квартал 2019 года, хотя на самом деле это не 2 квартал 2019 года до марта 2019 года. Итак, мой код в основном должен фиксировать возможные будущие даты, поэтому мой код выглядит так:
$fiscal_year = date("Y");
$fiscalPeriod = 'Q1';
pulldataBS($fiscal_year,$fiscalPeriod, $username,$password,$apiKey);
$fiscalPeriod = 'Q2';
pulldataBS($fiscal_year,$fiscalPeriod, $username,$password,$apiKey);
$fiscalPeriod = 'Q3';
pulldataBS($fiscal_year,$fiscalPeriod, $username,$password,$apiKey);
$fiscalPeriod = 'Q4';
pulldataBS($fiscal_year,$fiscalPeriod, $username,$password,$apiKey);
//year 2
$fiscal_year = $fiscal_year-1;
$fiscalPeriod = 'Q1';
pulldataBS($fiscal_year,$fiscalPeriod, $username,$password,$apiKey);
$fiscalPeriod = 'Q2';
pulldataBS($fiscal_year,$fiscalPeriod, $username,$password,$apiKey);
$fiscalPeriod = 'Q3';
pulldataBS($fiscal_year,$fiscalPeriod, $username,$password,$apiKey);
$fiscalPeriod = 'Q4';
pulldataBS($fiscal_year,$fiscalPeriod, $username,$password,$apiKey);
..etc в течение 5 лет. API просматривает $fiscal_year и $ fiscal_period и возвращает данные, если они доступны.
Функция такая:
function pullDataBS($fiscal_year,$fiscalPeriod, $username,$password,$apiKey) {
// function code here
}
Весь мой код работает при извлечении одного запаса. Сейчас я работаю над извлечением нескольких запасов, используя цикл while на моем pullData.php главная страница, и именно здесь у меня возникла проблема. Поскольку код повторяется для каждого нового запаса, я получаю фатальную ошибку cannot redeclare function . Я понимаю, почему это происходит, поскольку цикл обрабатывается как одна страница, и когда он попадает на второй ресурс, он выдает ошибки. Я пытаюсь выяснить, как обойти это. Я использовал
if(!function_exists('pullDataBS')) {
function pullDataBS($fiscal_year,$fiscalPeriod, $username,$password,$apiKey) {
//function code here
}
}
И я получаю неопределенную ошибку function pulldataBS, когда она попадает в вызов функции в самый первый раз (3-я строка кода, где она пытается использовать первые pulldataBS в этом примере). Вот мой pulldata.php главная страница:
while($research = mysqli_fetch_array($queryResearch)) {
$_SESSION['ticker'] = $research['symbol'];
include('pullBalanceSheet.php');
include('pullIncomeStatement.php');
// etc
}
Я предполагаю, что !function_exists неверно, или у меня есть какая-то другая критическая проблема с тем, как я закодировал свою функцию. Я надеюсь, что все это имеет смысл. Дайте мне знать, если вам нужен какой-либо другой код. Заранее спасибо!!
Комментарии:
1. Поместите все определения ваших функций в отдельный файл и вызовите его с помощью
require_once '/path/to/file.php
перед циклом.2. Нет необходимости повторно объявлять функцию на каждой итерации. Сделайте, как предложил @Qirel, или просто поместите
function
выше или ниже вашего цикла. Как правило, функция в PHP объявляется один раз и может использоваться часто.
Ответ №1:
Прежде всего, вы не должны включать pullBalanceSheet.php и pullIncomeStatement.php файлы в каждой итерации while
цикла. Возьмите ниже две строки за пределами while
цикла.
include('pullBalanceSheet.php');
include('pullIncomeStatement.php');
Теперь возникает проблема: вы не должны объявлять свои функции снова и снова, просто объявите их один раз и вызовите (с соответствующими аргументами) несколько раз в соответствии с вашими потребностями. Сказав это, вы можете использовать defined()
along with define()
functions для решения проблемы переопределения вашей функции.
if(!defined('PULL_DATA_BS')){
define('PULL_DATA_BS', 'pullDataBS');
function pullDataBS($fiscal_year,$fiscalPeriod, $username,$password,$apiKey) {
//function code here
}
}
Таким образом, эта функция не будет объявлена более одного раза. В идеале предполагается, что вы должны инкапсулировать весь код файла с нижеприведенным блоком.
xyz.php
<?php
if(!defined('XYZ_PHP')){
define('XYZ_PHP', 'xyz.php');
// file code
}
?>
Таким образом, вы предотвратите включение этого кода файла (и кого-либо еще) более одного раза.