PHPでプログラムを組んでいくと「Fatal error: Cannot redeclare」というエラーが発生するとあります。
このエラーは”redeclare”のあとに必ず定義した関数名が来るのですが、タイプミスや構文エラーを起こしていないにもかかわらず、なぜこのエラーが発生してしまうのでしょうか?
今回は「Fatal error: Cannot redeclare」の原因について解説していきます。
Fatal error: Cannot redeclare ()の原因
「Fatal error: Cannot redeclare ()」同じ名前の関数を2つ以上定義してしまった場合に発生するエラーです。
<?php
function sample(){
return 100;
}
function sample($a):int{
return 100+$a;
}
?>
PHPは関数をオーバーロードできない仕様であるため、引数の数や型によって実行する関数を振り分けることができず、上記のような引数が異なるなどの同名の関数を定義できません。
複数ファイルに分けてプログラミングしている場合や外部ライブラリを利用しているときにやってしまいがちです。
PHPでプログラミングするには同名の関数が定義されないように気をつけるようにしましょう。
関数名の大文字小文字は区別されない
PHPの言語仕様として特に注意しなければならないのが、関数名の半角アルファベットは大文字小文字が区別されないということです。
例えばsample関数とSAMPLE関数は全く同じ関数と解釈して実行されてしまうため、以下のコードは「Fatal error: Cannot redeclare ()」エラーを引き起こします。
<?php
function sample(){
return 'small';
}
function SAMPLE(){
return 'big';
}
?>
クラス内でプライベート関数は大文字、外部から使える(public)関数は小文字というようにしていても、PHPにとってはどちらも同じものとして見られてしまうので気をつけてください。
すでにある関数名を使おうとしている場合も注意
当然ですが、PHPには基本的な関数が最初から用意されています。
例えばprint_r関数。以下のコードはprint_r関数を一回しか定義されていませんが、PHP側ですでに定義されている関数であるため、2回以上同じ関数名を使用したということでエラーになります。
<?php
function print_r($str){
echo $str;
}
?>
シンプルな関数名を使うと他の関数とかぶりやすいので注意してください。
グローバル関数とクラスメソッドは別扱い
PHPはクラスの定義ができますが、グローバル関数とクラスメソッドは別扱いとなります。そのため以下のコードのfunc関数はどちらも有効で、それぞれ異なる関数として実行されます。
<?php
class sample{
public static function func(){
return 'Sample Class' . PHP_EOL;
}
};
function func(){
return 'Global Function' . PHP_EOL;
}
echo sample::func(); //Sample Class
echo func(); //Global Function
?>
クラス化することで関数名の重複だけでなく変数名・定数名の重複も防ぎやすくなるので、規模が大きいプログラムを開発する際はクラス化して重複エラーなどのヒューマンエラーが起きにくい状態で開発をすすめるといいでしょう。