- ベストアンサー
既存関数の上書き
PHPで既存の関数、例えば fgetcsv()関数と同名の関数を作ることは可能でしょうか? ソースの書き換えが面倒なのでいい方法があるのでしたら、教えてほしいです。 既存の関数が無い場合は、以下の方法で安全に作成できますが・・・ if (! function_exists( 関数名 ) ) { 関数定義 } 皆さんは、このような場面では、どのようにしているのでしょうか? 仕方なく、ソースをすべて書き換えているのでしょうか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
> PHPで既存の関数、例えば fgetcsv()関数と同名の関数を作ることは可能でしょうか? これ自体は可能だと思います。やったことがありませんが。 function fgetcsv(){} > 皆さんは、このような場面では、どのようにしているのでしょうか? 既存の関数を書き換えることがないように、設計を見直します。 通常はプレフィクスを付けるかネームスペースを付ける(?)(Javaで言うシングルトン)かのどちらかですね。 > ソースの書き換えが面倒なのでいい方法があるのでしたら、教えてほしいです。 プレフィクスの部分をエディタの全置換で一発変換できますし。 function taloo_fgetcsv(){} class taloo { function fgetcsv(){} } taloo_fgetcsv(); taloo::fgetcsv(); > 既存の関数が無い場合は、以下の方法で安全に作成できますが・・・ > if (! function_exists( 関数名 ) ) { > 関数定義 > } これだけでは、既存の関数名と重複していたら、 自分が思うとおりの動きがしない関数(他人が作った関数)を実行してしまう、ということになると思います。 classを作るにしても、class_exists()があります。 これがtrueになって自分のclassを作れなければ、自分の関数は実行できません。 誰かが作ったclass class myclass{ function get_data_from_csv(){ } } myclass::get_data_from_csv(); //実行可能 自分で作るclass if(!class_exists('myclass')){ class myclass{ function fgetcsv(){ } } } myclass::fgetcsv(); //myclassは存在するが、メソッドが無くてエラー プレフィクスやネームスペースは名前の重複を可能な限り避けるというだけで、絶対ではありません。 クラス名、関数名が重複して動かなくなるなら、「関数がなければ作る」以外の対策は必要だと思います。 (phpは初めて間もないですが、function_exists()は「関数がなければ作る」ための物ではないと思います。)
その他の回答 (2)
- yambejp
- ベストアンサー率51% (3827/7415)
>皆さんは、このような場面では、どのようにしているのでしょうか? クラスを使えば既存の関数名でも競合しません。 phpを使う人は普通はクラスを使うのでそういう場面に会うことはありません。 <? class hoge{ function fgetcsv($str){ echo $str; } } hoge::fgetcsv("test"); ?> ただし、print文などは関数ではなく構文なのでエラーになります。
- wild-rain
- ベストアンサー率44% (26/58)
ここで言っている既存の関数というのは、PHPであらかじめ定義されている関数(fgetcsvのような)を指しているのですよね。 自分で作成した既存の関数であれば、当然そちらを変更すれば新たに作成する必要は無いと思いますが、いわゆる組み込み関数の場合、それをオーバーライドするのは危険かと思います。 たとえば、バイナリに組み込まれている関数をどうしても変更したいのであれば、PHPのソースから修正してリコンパイルすることで対処は可能かもしれませんが、他の部分からその関数を利用していることが想定されるので、やめた方が安全だと思います。 確実に変更する対象が限定されるのであれば、find+awkとかで一発で変換してしまうのも手かと思います。