web-dev-qa-db-ja.com

「致命的なエラー:<関数>を再宣言できません」

私は機能を持っています(これは私のファイルの上部から表示されるとおりです):

<?php
//dirname(getcwd());
function generate_salt()
{
    $salt = '';

    for($i = 0; $i < 19; $i++)
    {
        $salt .= chr(Rand(35, 126));
    }

    return $salt;
}
...

そして、何らかの理由で、私はエラーを取得し続けます:

致命的エラー:/Applications/MAMP/htdocs/questions-air/includes/functions.phpのgenerate_salt()(/Applications/MAMP/htdocs/question-air/includes/functions.php:5で以前に宣言された)を再宣言できません13

このようなエラーが発生する理由と方法を理解することはできません。何か案は?

32
fishman

このエラーは、関数がすでに定義されていることを示しています。意味することができます:

  • 2つのファイルで同じ関数が定義されています
  • または、同じファイル内の2つの場所で同じ関数が定義されている
  • または、関数が定義されているファイルが2回含まれています(したがって、関数が2回定義されているようです)

3番目の点を支援するための解決策は、 include_onceinclude の代わりにfunctions.phpファイル-したがって、複数回含めることはできません。

65
Pascal MARTIN

解決策1

ループ内で関数を宣言しないでください(foreachforwhile...など)!それらの前に宣言します。

解決策2

そのファイル(その関数が存在する)を1回だけ含める必要があります。
use:[include_once("functions.php");
代わりに:include ("functions.php");

解決策3

上記のいずれも役に立たない場合、関数宣言の前に、再宣言を避けるためにチェックを追加します。

if (!function_exists('your_function_name'))   {
  function your_function_name()  {
    ........
  }
}
42
T.Todua

おそらく、ファイルfunctions.phpを複数回インクルードしているでしょう。

5
codaddict

関数を記述する前に、関数の名前が存在しないかどうかを最初に確認できます

  if (!function_exists('generate_salt'))
{
    function generate_salt()
    {
    ........
    }
}

または、関数の名前を別の名前に変更できます

3
ahmed hamdy

このエラーが発生するもう1つの考えられる理由は、関数が別のPHP組み込み関数と同じ名前を持っていることです。たとえば、

function checkdate($date){
   $now=strtotime(date('Y-m-d H:i:s'));
   $tenYearsAgo=strtotime("-10 years", $now);
   $dateToCheck=strtotime($date);
   return ($tenYearsAgo > $dateToCheck) ? false : true;
}
echo checkdate('2016-05-12');

checkdate関数は既にPHPに存在します。

3
Pawel Glowacki

* .php.bak(メモ帳によって自動的に作成された)がコンパイルに含まれていたとき、私は奇妙な振る舞いをしました。フォルダからすべての* .php.bakを削除すると、このエラーはなくなりました。たぶんこれは誰かに役立つでしょう。

3
Roman

私の場合、それは別の関数内の関数のためでした!関数を削除すると、エラーはなくなり、すべてが期待どおりに機能しました。

この回答 関数内で関数を使用しない理由を説明します

これは誰かを助けるかもしれません。

2

function_exists('fun_name')は好きではありません。関数名が文字列に変換されることに依存していることに加えて、2回名前を付ける必要があります。リファクタリングで簡単に壊れる可能性があります。

関数をラムダ式として宣言します(この解決策については言及していません):

$generate_salt = function()
{
    ...
};

そして、このように使用します:

$salt = $generate_salt();

次に、上記のPHPコードの再実行時に、関数は前の宣言を単純に上書きします。

1
Staplerfahrer

同じ問題がありました。そして最後に二重のインクルードでした。 1つはXという名前のファイルにインクルードし、もう1つはYという名前のファイルにインクルードします。

0
josemaria

指定したコードには明示的に何も含まれていないため、2回含まれているか、(スクリプトがコードのエントリポイントである場合)we​​bserver config/php.iniに自動追加が設定されている必要がありますまたは、機能を定義する本当にあいまいな拡張機能がロードされています。

0
symcbean

get_included_filesを使用することをお勧めします。Pascalが間違ったファイルを見ているか、含まれているファイルでこの関数が既に定義されていると言っているからです。

require_onceは、インクルードしようとしているファイルが不可欠な場合にも役立ちます。

0
John Parker

同じ名前のクラスをすでに作成していることを意味します。

例えば:

class ExampleReDeclare {}

// some code here

class ExampleReDeclare {}

2番目のExampleReDeclareはエラーをスローします。

0
Naitik Shah

または、ループで関数を作成できます

  • といった

    for($ i = 1; $ i <5; $ i ++){function foo(){echo 'something'; }}

foo();
//再宣言に関するエラーが表示されます

0
rut