Не удается повторно объявить функцию, выполняющуюся во время цикла

#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

    }
?>
 

Таким образом, вы предотвратите включение этого кода файла (и кого-либо еще) более одного раза.