![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
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()は「関数がなければ作る」ための物ではないと思います。)
No.2
- 回答日時:
>皆さんは、このような場面では、どのようにしているのでしょうか?
クラスを使えば既存の関数名でも競合しません。
phpを使う人は普通はクラスを使うのでそういう場面に会うことはありません。
<?
class hoge{
function fgetcsv($str){
echo $str;
}
}
hoge::fgetcsv("test");
?>
ただし、print文などは関数ではなく構文なのでエラーになります。
No.1
- 回答日時:
ここで言っている既存の関数というのは、PHPであらかじめ定義されている関数(fgetcsvのような)を指しているのですよね。
自分で作成した既存の関数であれば、当然そちらを変更すれば新たに作成する必要は無いと思いますが、いわゆる組み込み関数の場合、それをオーバーライドするのは危険かと思います。
たとえば、バイナリに組み込まれている関数をどうしても変更したいのであれば、PHPのソースから修正してリコンパイルすることで対処は可能かもしれませんが、他の部分からその関数を利用していることが想定されるので、やめた方が安全だと思います。
確実に変更する対象が限定されるのであれば、find+awkとかで一発で変換してしまうのも手かと思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(教育・科学・学問) 関数、写像について 1 2022/04/10 23:45
- 数学 数学 2変数データで、「相関係数=−1」の散布図を書く際 写真に これら5組のデータの散布図を描くと 4 2023/02/15 10:46
- Excel(エクセル) Excel 参照元の値を参照したい 1 2022/08/20 18:58
- Excel(エクセル) 数列の数値補間 2 2022/10/27 16:38
- C言語・C++・C# C言語初心者 ポインタについて、お助けください、、 2 2023/03/15 23:50
- その他(プログラミング・Web制作) pythonのグローバル変数 2 2022/11/25 18:02
- 数学 代数学 環 1 2022/10/12 17:29
- 物理学 量子力学 球面調和関数 導出 方位角成分 微分方程式の解 2 2022/07/02 13:40
- 数学 【数学ⅲ】三角関数と合成関数の微分について 4 2022/07/07 21:44
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBA コレクションに2次元配列...
-
classの再定義エラーについて
-
可変変数にアロー演算子を使いたい
-
PHPの変数値をリンクさせたい
-
関数の動きと記述方法の意味を...
-
PHPで、相対的な変数名の場合の...
-
サブネットマスクを用いたIP制...
-
Fatal error: Cannot use []
-
VB.NETからVBAマクロ(引数)を呼...
-
デフォルトの定義済みクラスに...
-
共用体のサイズをsizeofで
-
【Objective-c】rubyの__send__...
-
既存関数の上書き
-
VB6のコンボボックスのテキスト...
-
PHPプログラム上で「URLを直接...
-
PHP Catchable fatal error の...
-
PHP、ヒアドキュメント内でのIF...
-
メール本文の構成 行頭空白
-
Dosブロンプトでtabを出力したい
-
wordの差し込み印刷で文字...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBA コレクションに2次元配列...
-
エラーの理由が分りません。Pri...
-
可変変数にアロー演算子を使いたい
-
VB.NETからVBAマクロ(引数)を呼...
-
PHP、ヒアドキュメント内でのIF...
-
VB.NETSystem.Xml 要素数を得る...
-
どういうプログラムを関数化を...
-
vb作成したらでbeep音が鳴りま...
-
次のhtml・cssでspan内の文字を...
-
classの再定義エラーについて
-
既存関数の上書き
-
protectedなのにアクセスできな...
-
配列の操作時にLNK2001外部シン...
-
UNIX CP "で上書きしません"
-
PHPでの画像の形式の変換
-
PHPプログラム上で「URLを直接...
-
Let's Encryptで自動更新がされ...
-
ExcelVBAで部分一致(*)をしたい
-
VB6のコンボボックスのテキスト...
-
ASPのResponse.WriteをPHPでは...
おすすめ情報