无法重新声明while循环中执行的功能

时间:2019-04-14 15:25:16

标签: php function

我是函数的新手,我可能做得不太好,可以为此提供一些帮助。我正在从网站API获取股票信息。所有要提取的信息都是通过几个.php页面完成的,我有一个包含所有必需页面的文件。所以我有这样的事情: pullBalanceSheet.php用于所有资产负债表数据 pullIncomeStatement.php用于所有收入表数据 等等,共有10页。所有页面都可以彼此独立运行,并且这样创建即可轻松测试每个API调用。 我有一个母版页(pullData.php),其中包含每个页面的必要包含,因此它可以有效地将所有页面作为一个页面运行。我希望这是有道理的。

我的某些页面包含一个函数,这可能不是我最好的方法,但是页面可以提取正确的数据。这些页面列出了过去5年的季度财务信息。问题在于,每个公司对季度财务日期的陈述都不同。因此,假设是2019年1月,即使到2019年3月才真正是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
    }

提取一只股票时,我所有的代码都有效。我现在正在通过在pullData.php主页上使用while循环来拉动多只股票,而这就是我遇到的问题。由于代码会为每只新股票重复,因此出现了致命错误,无法重新声明函数。我知道为什么会发生这种情况,因为循环被视为单页处理,当它碰到第二张纸时就会出错。我正在尝试找出解决方法。我用过

    if(!function_exists('pullDataBS')) { 
      function pullDataBS($fiscal_year,$fiscalPeriod, $username,$password,$apiKey) {
      //function code here
    }
    }       

我第一次遇到函数调用时遇到了一个未定义的函数pulldataBS错误(在此示例中,代码的第三行尝试了第一个pulldataBS)。这是我的pulldata.php主页:

    while($research = mysqli_fetch_array($queryResearch)) {  
      $_SESSION['ticker']  = $research['symbol']; 
      include('pullBalanceSheet.php'); 
      include('pullIncomeStatement.php');
      // etc
    }

我假设!function_exists不正确,或者我对函数的编码方式存在其他严重问题。我希望这一切都有意义。让我知道是否需要其他代码。在此先感谢!

1 个答案:

答案 0 :(得分:0)

首先,您不应在while循环的每次迭代中包含 pullBalanceSheet.php pullIncomeStatement.php 文件。在while循环之外的下面两行。

include('pullBalanceSheet.php'); 
include('pullIncomeStatement.php');

现在出现了问题,您不必一遍又一遍地声明您的函数,只需声明一次并根据需要多次调用它(使用适当的参数)即可。话虽如此,您可以将defined()define()函数一起使用来解决函数重新发布问题。

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

    }
?>

这样,您将防止自己(和其他人)多次包含此文件代码。