私は機能を持っています(これは私のファイルの上部から表示されるとおりです):
<?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
このようなエラーが発生する理由と方法を理解することはできません。何か案は?
このエラーは、関数がすでに定義されていることを示しています。意味することができます:
3番目の点を支援するための解決策は、 include_once
include
の代わりにfunctions.php
ファイル-したがって、複数回含めることはできません。
ループ内で関数を宣言しないでください(foreach
、for
、while
...など)!それらの前に宣言します。
そのファイル(その関数が存在する)を1回だけ含める必要があります。
use:[include_once("functions.php");
代わりに:include ("functions.php");
上記のいずれも役に立たない場合、関数宣言の前に、再宣言を避けるためにチェックを追加します。
if (!function_exists('your_function_name')) {
function your_function_name() {
........
}
}
おそらく、ファイルfunctions.phpを複数回インクルードしているでしょう。
関数を記述する前に、関数の名前が存在しないかどうかを最初に確認できます
if (!function_exists('generate_salt'))
{
function generate_salt()
{
........
}
}
または、関数の名前を別の名前に変更できます
このエラーが発生するもう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に存在します。
* .php.bak(メモ帳によって自動的に作成された)がコンパイルに含まれていたとき、私は奇妙な振る舞いをしました。フォルダからすべての* .php.bakを削除すると、このエラーはなくなりました。たぶんこれは誰かに役立つでしょう。
私の場合、それは別の関数内の関数のためでした!関数を削除すると、エラーはなくなり、すべてが期待どおりに機能しました。
この回答 関数内で関数を使用しない理由を説明します。
これは誰かを助けるかもしれません。
function_exists('fun_name')
は好きではありません。関数名が文字列に変換されることに依存していることに加えて、2回名前を付ける必要があります。リファクタリングで簡単に壊れる可能性があります。
関数をラムダ式として宣言します(この解決策については言及していません):
$generate_salt = function()
{
...
};
そして、このように使用します:
$salt = $generate_salt();
次に、上記のPHPコードの再実行時に、関数は前の宣言を単純に上書きします。
同じ問題がありました。そして最後に二重のインクルードでした。 1つはXという名前のファイルにインクルードし、もう1つはYという名前のファイルにインクルードします。
指定したコードには明示的に何も含まれていないため、2回含まれているか、(スクリプトがコードのエントリポイントである場合)webserver config/php.iniに自動追加が設定されている必要がありますまたは、機能を定義する本当にあいまいな拡張機能がロードされています。
get_included_files
を使用することをお勧めします。Pascalが間違ったファイルを見ているか、含まれているファイルでこの関数が既に定義されていると言っているからです。
require_once
は、インクルードしようとしているファイルが不可欠な場合にも役立ちます。
同じ名前のクラスをすでに作成していることを意味します。
例えば:
class ExampleReDeclare {}
// some code here
class ExampleReDeclare {}
2番目のExampleReDeclareはエラーをスローします。
または、ループで関数を作成できます
といった
for($ i = 1; $ i <5; $ i ++){function foo(){echo 'something'; }}
foo();
//再宣言に関するエラーが表示されます