• ベストアンサー

既存関数の上書き

PHPで既存の関数、例えば fgetcsv()関数と同名の関数を作ることは可能でしょうか? ソースの書き換えが面倒なのでいい方法があるのでしたら、教えてほしいです。 既存の関数が無い場合は、以下の方法で安全に作成できますが・・・ if (! function_exists( 関数名 ) ) { 関数定義 } 皆さんは、このような場面では、どのようにしているのでしょうか? 仕方なく、ソースをすべて書き換えているのでしょうか?

  • ne5
  • お礼率4% (5/124)
  • PHP
  • 回答数3
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
回答No.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)
回答No.2

>皆さんは、このような場面では、どのようにしているのでしょうか? クラスを使えば既存の関数名でも競合しません。 phpを使う人は普通はクラスを使うのでそういう場面に会うことはありません。 <? class hoge{ function fgetcsv($str){ echo $str; } } hoge::fgetcsv("test"); ?> ただし、print文などは関数ではなく構文なのでエラーになります。

  • wild-rain
  • ベストアンサー率44% (26/58)
回答No.1

ここで言っている既存の関数というのは、PHPであらかじめ定義されている関数(fgetcsvのような)を指しているのですよね。 自分で作成した既存の関数であれば、当然そちらを変更すれば新たに作成する必要は無いと思いますが、いわゆる組み込み関数の場合、それをオーバーライドするのは危険かと思います。 たとえば、バイナリに組み込まれている関数をどうしても変更したいのであれば、PHPのソースから修正してリコンパイルすることで対処は可能かもしれませんが、他の部分からその関数を利用していることが想定されるので、やめた方が安全だと思います。 確実に変更する対象が限定されるのであれば、find+awkとかで一発で変換してしまうのも手かと思います。

関連するQ&A

  • function_exists関数の挙動について

    以下のphpのコードを実行すると、 「hogehoge()関数が定義済みです。」とブラウザに表示されます。 ですが、スクリプトは上から下へ向かって実行されるわけで、 <if(function_exists('hogehoge'))>の箇所では、hogehoge関数はそんざいしないのでfalseに なると思うのです。 いったいどういう理屈なんでしょうか? よろしくお願い申し上げます。 (なお、下記ソースではタブを全角空白4文字に変換しています) <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>関数が定義済みか調べる</title> </head> <body> <div> <?php if(function_exists('hogehoge')){     echo 'hogehoge()関数が定義済みです。'; }else{     echo 'hogehoge()関数は未定義です。'; } function hogehoge(){} ?> </div> </body> </html>

    • ベストアンサー
    • PHP
  • phpコールバック関数について

    php初心者のものですが、コールバック関数(可変関数)についての質問です。 //引数の与えらえられた名前をもつ関数が存在すれば呼び出すための関数 function func_caller($name)(2) { if (function_exists($name)) { (3) $name(); //可変換数をして関数の呼び出し } } function foo() { echo 'foo call', PHP_EOL; } func_caller('foo'); //foo called(1) とあるのですが (1)の関数が(2)に呼ばれて$nameはfooが入ってて (3)が評価されまでわかるのですが次にどうなっていくのかわかりません。 どなたかわかる方いらっしゃいましたらどうか教えていただけないでしょうか? 何卒よろしくお願い致します。

    • ベストアンサー
    • PHP
  • 再帰関数のサポートについて

    http://ja.phptherightway.com/pages/Functional-Programming.html 上記ページにありますようにPHPは再帰関数をサポートとあります。 関数プログラミングなるものはこの再帰関数を使ってループをつくったりすると ききました。 たとえば function roop($i){ print($i); $n = $i + 1; if($n < 100){ roop($n); } } roop(1); というようなコードでしょうか。 これは1~99までのループですよね。 これはPHPがインタープリターといえど、一度 PHP専用のバイトコードに変換して からPHPエンジンがバイトコードを実行するため再帰が可能という解釈でもんだいないですかね? もしほんとうに逐次解釈なインタープリターなら解釈途中に、その関数自体の定義をインタープリターが認識? し終わる前に未定義状態の関数が出現してしまうってことですよね? undefined な関数があるといようなエラーがでてくのでしょうか? 生Cのソースみればわかるのでしょうけれども、私はCがわからないので・・・。 概要でよいのでご教授ください。

    • ベストアンサー
    • PHP
  • php 自作関数

    PHPでfunctionによって定義される関数を作っているのですが 引数なしで関数をつくることは可能なのでしょうか? 例えば function hello{ print "HelloPhp"; } 理想ではphp側でhello関数を呼び出せばHelloPhpと出力されます 実際の使い道は関数名が使い辛いので別の名前で関数名を定義したいんです 引数を与えてもいいのですがfunction側で引数が固定されるためphp側と毎回同じ変数:引数にならない 説明し辛いのですが 先ほど述べた理由で使いたいのですが、わかる方いらっしゃったらよろしくお願いします

    • 締切済み
    • PHP
  • PHPで定義されている関数のコードが見たい

    PHPでコードを記述するとき、関数を定義することがあります。 function test($name){ : : } しかし、最初から定義されている関数がありますよね。 isset()やfile_get_contents()などの関数です。 こういった関数の中身をみたいのですが、PHPのどの部分を見ればいいのでしょうか。 関数の中身とは、たとえばfile_get_contentsなら function file_get_contents($name){ : //この部分のことです。 : } PEARだったら、たとえばDB.phpならばDB,phpの中身を見ればいいのですが、fopen()などの最初から定義されている関数はどこを見れいいのかがわかりません。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • ユーザー定義関数

    自サイトのアクセス解析をしようと SERVER変数を取得してログを解析しようとPHPで組んでみたのですが、 いまいちユーザー定義関数の上手?な使い方がわかりません。 アドバイスを頂けると幸いに思います。 データはcsv(すみませんSQL使えません)ファイルに1アクセス1行 日付,時間,キャリア等々 と記述しています。 ドコモをカウントする場合 function doco( $Key){ $handle = fopen( "LogFile", "r"); $count= 0; while (($data = fgetcsv($handle)) !== FALSE) {  if( mb_eregi( $Key, $data[2])){ $count++; } } echo $count; fclose($handle); } doco( "DoCoMo"); となり、さらに時間別にドコモで0時に来訪したのは何人? といった場合 ifの中にさらに時間の判別のifを記述し 引数の部分を増やしdoco( 引数1,引数2)見たいな感じにしますが そうではなく、 ドコモだけの人数を取り出したい場合も ドコモから12時の人数だけを取り出したい場合も 同じユーザー定義関数を使う方法はありますか? 宜しくお願いします。

    • 締切済み
    • PHP
  • phpで関数を定義するfunctionは、なんとい

    phpで関数を定義するfunctionは、なんという物なんですか?

    • ベストアンサー
    • PHP
  • webサーバにディレクトリを作るときの有無チェック

    phpのある関数内でwebサーバにディレクトリを作っています。 ここで作ろうとしているディレクトリが既にあるとエラーになるため、そのディレクトリがなければ作るようにしていますが、 ・目的のディレクトリと同名のファイルがない(作られない)ことが分かっている ・この関数が呼ばれる頻度が高い とき、下記のどっちの方法が良いのでしょうか? 1.そのディレクトリが無ければ作る if(!file_exists($newDir)) {  mkdir($newDir); } 2.エラーを無視する @mkdir($newDir);

    • ベストアンサー
    • PHP
  • PHPの関数の二重定義を防ぐには?

    phpでオリジナルの関数を作成したとき プログラムのミス等で、二度定義されてしまった時 Fatal error: Cannot redeclare というような、エラーが出ますが、include_onceのonceみたいな これを、出さぬよう、定義側で一度しか定義させないように するようにはできないのでしょうか? if($flag){   function hoge(){} } $flag = 1 のようにフラグを立てるしかないのでしょうか?

    • ベストアンサー
    • PHP
  • 関数定義の関数名の前にある&(アンパサンド)他

    関数定義で function &関数名() と関数名の前にアンパサンドを付けて定義しているものは、付けない普通の定義と何が違ってくるのでしょうか? あと、クラス関係で使われている::(コロン2つ)の使われ方がよくわかりません。 いくつかPHPの本を読みましたが上記2つのことについて明確に記述してあるものが見当たりませんでした。 ご教授お願いいたします。

    • ベストアンサー
    • PHP

専門家に質問してみよう