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で質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
PHPの名前空間インポートについて
-
VBA コレクションに2次元配列...
-
CSVファイルをブラウザのキャッ...
-
PHP、ヒアドキュメント内でのIF...
-
サブネットマスクを用いたIP制...
-
【C#】DataGridViewの最大列数...
-
wordの差し込み印刷で文字...
-
Dosブロンプトでtabを出力したい
-
「取得先」という表現について
-
EXCEL、マクロ-改ページ行番号...
-
ps3で久しぶりにCDの音楽情報取...
-
shシェルスクリプト 空白行の...
-
switch()文で値の大小比較
-
バッチファイルでpingの結果を...
-
ログインしたら他からログイン...
-
小数点以下0の非表示
-
【C#】FindWindowExの使い方を...
-
フォームからのデータを繰り返...
-
session_start()で生成されるセ...
-
築24年の中古住宅は住宅ローン...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBA コレクションに2次元配列...
-
エラーの理由が分りません。Pri...
-
VB.NETからVBAマクロ(引数)を呼...
-
classの再定義エラーについて
-
可変変数にアロー演算子を使いたい
-
ASPのResponse.WriteをPHPでは...
-
PHPの名前空間インポートについて
-
protectedなのにアクセスできな...
-
PHPの変数値をリンクさせたい
-
条件式 ! char[0] とは
-
fwriteで改行出来ない
-
PHP、ヒアドキュメント内でのIF...
-
vb作成したらでbeep音が鳴りま...
-
UNIX CP "で上書きしません"
-
Smarty変数の値をJavascript変...
-
変数に格納できる桁数に制限は...
-
Type.GetMethodで困っています
-
PHPでの画像の形式の変換
-
正規表現 ファイル名の取得
-
PHPで連番を繰り返す
おすすめ情報