include_once、require_once で関数2重定義のエラー - PHPプロ!Q&A掲示板

134

  • 500P

include_once、require_once で関数2重定義のエラー

質問日時 / 2006年8月10日 09:36    回答数 / 9件

Questioner:  s_hardcore17  このエントリーをはてなブックマークに追加 

キーワード / include    Fatal error    require   

お世話になっております。

現在、include_once、require_onceを使用しても、
関数2重定義のエラーが平均10回1度くらいはかれて、困惑しています。

require_once './関数を定義したファイル.php';

include_once('./関数を定義したファイル.php');

等、前の./を消したり、
関数を定義したファイルにreturnを記述してみたり、

require、includeを使用したりと、
色々試しては見たのですが、どれもたまに、
関数2重定義のエラーが返されてしまいます。

更新すると、また動作するようになるのですが。

読み込まれる元ファイルでは、2重に関数を定義してはいません。

エラーメッセージは、
Fatal error: Cannot redeclare **関数名() (**パス:10) in **パス on line 27(←そのファイルの?>の部分です。)

これはinclude,requireどちらを使用しても変わりませんでした。

他で作成したユーザ定義関数やPEARのファイルを読むこむところでも
同じ様なエラーがたまに起きるので、php.iniの設定の問題とかあるんでしょうか?

申し訳ございませんが、どうにも行き詰まっていますので、
よろしくお願いいたします。

この質問への意見の募集は締め切られ、ポイントは既に配分されました。
意見を投稿することはできますが、ポイントを受け取ることはできません。



ツリー一覧

┣A01wakabadou実行しようとしているファイルから辿れる、「読み込ま
┃┗A01-1s_hardcore17ありがとうございます。 構成しているファイル全体
┣A02do_ikare池田と申します。 よろしくお願いします。 読み込
┃┗A02-1s_hardcore17すいません。 中身を記述すべきでした。 <?php
┣A03tatsujinこんにちは。 おそらく、関数の二重定義というより
┃┗A03-1s_hardcore17ユーザ定義関数を呼び出すには、全て、require_onceを
┃ ┗A03-1-1s_hardcore17この関数の使用で今のところエラーは出ておりません。
┗A04shimism見当違いかもしれませんので違ったら無視してください
 ┗A04-1s_hardcore17すいません。 環境を載せていなかったです。 失礼

回答一覧

並び替え:

A01 満足
answererwakabadou [8月10日 12:27]

実行しようとしているファイルから辿れる、「読み込まれたファイル全体」の中のどこかで関数が2重定義されていると考えられます。

get_included_files関数を使えばincludeやrequireで読み込んでいるファイル名一覧を取得できます。
取得したファイル名一覧のファイルを全部調べて、同じ名前の関数があるかどうかを探すのが早いかと考えられます。

この意見に回答する

ツリーへ TOPへ

A01-1
replyers_hardcore17 [8月11日 13:32]

ありがとうございます。

構成しているファイル全体で定義している個所は一つだけでした。
しかしget_included_files関数は問題きりわけの参考になりました。

ありがとうございました。

引き続き、他の方々頂きました対応を試してみたいと思います。

この意見に回答する

ツリーへ TOPへ

A02
answererdo_ikare [8月10日 14:18]

池田と申します。
よろしくお願いします。

読み込んでいるファイルの定義が分かりませんので想像ですが、関数内で関数を定義している箇所などはありませんか?

関数内で関数を定義していれば、その関数を呼び出すたびに新たに関数が定義されますので、同じようなエラー状況が発生するかと思いますが。

<イメージ>
function hoge()
{
  function foo()
  {
    ....
  }
}
hoge();
hoge(); // エラー発生

(呼び出し側の終端位置がエラー発生箇所になっている説明はつきませんが。)

以上、的外れでしたら申し訳ありません。

この意見に回答する

ツリーへ TOPへ

A02-1
replyers_hardcore17 [8月11日 13:35]

すいません。
中身を記述すべきでした。

<?php
    /*************************
    日付選択のセレクトボックスで、
    db内の最小の日付ならselectedとか、今日の日付ならselectedを実装する関数。
    
    date_select(セレクトボックスに表示させたい配列,セレクトさせる変数。)
    *************************************/
    
    function dateselect($array,$value){
    
        for($i=0;$i<count($array);$i++){
            
            if($value == $array[$i]){
                
                echo "<option value=\"".$array[$i]."\" selected>".$array[$i]."</option>";
                
            }else{
                
                echo "<option value=\"".$array[$i]."\">".$array[$i]."</option>";
                
            }
            
        }

    //return TRUE; //つけてもなくても、エラーが発生。
}
?>

がユーザ定義関数なのですが、
function内でfunctionは使用しておりません。

この意見に回答する

ツリーへ TOPへ

A03 満足
answerertatsujin [8月10日 17:17]

こんにちは。

おそらく、関数の二重定義というよりは、2重にファイルを読みこんでしまっているのでは?
grepでinclude or require を探してみてonceにするのはどうでしょう。

また最終手段としては問題の関数を
if (!function_exists("myFunction")) {
function myFunction() {
//処理
}
}

みたいにしてしまうのはどうでしょう。根本的な解決にはなりませんが。

この意見に回答する

ツリーへ TOPへ

A03-1
replyers_hardcore17 [8月11日 13:37]

ユーザ定義関数を呼び出すには、全て、require_onceを使用するようにしています。
function_exists 関数はとても参考になりました。

今から試してみます。
また結果を報告させていただきます。

ありがとうございました。

この意見に回答する

ツリーへ TOPへ

A03-1-1
replyers_hardcore17 [8月21日 09:31]

この関数の使用で今のところエラーは出ておりません。ありがとうございました。

この意見に回答する

ツリーへ TOPへ

A04
answerershimism [8月10日 20:55]

見当違いかもしれませんので違ったら無視してください。

phpinfo(1);を実行して
貼り付けてくれると多少なりともアドバイスできますが。

あくまでも予測ですがもしかしてWindowsを使用していませんか?
バグ報告がリストにありますが
http://bugs.php.net/bug.php?id=37766
このバグに関しては
わたしのWindows環境ではphp-5.1.4のCLI版のみ再現できます。
Apache通すと問題なく動作しますし、他のOS環境では起きませんので原因不明ですが、
なんとなく予想だけはついています。

>更新すると、また動作するようになるのですが。
何を更新するのかわからないので推測ですが、キャッシュ系拡張モジュールを
利用しているのでしょうか?その場合はキャッシュモジュール側で
キャッシュされているファイルをもう一度読み込むと
同じ関数が定義されている状態になりますし、
キャッシュ系モジュールの設定で期限が時間設定に
なっているならばその可能性もあるかもしれません。

どちらも推測ですので参考までに・・・

この意見に回答する

ツリーへ TOPへ

A04-1
replyers_hardcore17 [8月11日 13:45]

すいません。

環境を載せていなかったです。
失礼しました。

OS:WIN2000SERVER
サーバ:IIS

php5.1.2

です。
ご指摘どおりwindowsです。

バグ報告リストの内容は今ひとつ理解できませんでした。
申し訳ございません。

phpinfo(1);
の結果は、

Server API  ISAPI  
Virtual Directory Support  enabled  

Debug Build  no  
Thread Safety  enabled  
Zend Memory Manager  enabled  
IPv6 Support  enabled  
Registered PHP Streams  php, file, http, ftp, compress.zlib  
Registered Stream Socket Transports  tcp, udp  
Registered Stream Filters  convert.iconv.*, string.rot13, string.toupper, string.tolower, string.strip_tags, convert.*, zlib.*  

一部削除していますが、以上でした。

この意見に回答する

ツリーへ TOPへ

<<質問一覧へ



Pick Up Q&A

Q
array_mergeの再帰処理の動作について
 このエントリーをはてなブックマークに追加 
A
>1個になったとき$leftを返しますが、 >このとき、最終的な$leftはnullになるかと思います。 いいえ、最後は「渡された配列をそのまま」返します。要素が2以上あるときとの違いは(並べ替えずに戻るので...

>>続きを読む

再帰関数は最初の内は混乱しますが、非常に上手く使える場面もいずれ出てきます。これを機会に学んでいけるといいですね。

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)