
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を探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
vb作成したらでbeep音が鳴りま...
-
現在PHPとsmartyを勉強している...
-
Dosブロンプトでtabを出力したい
-
バッチファイルでPCのモデル名...
-
VBで他アプリの「syslistview32...
-
C# ASP.NET でIPアドレスからア...
-
findstrのerrorlevel
-
小数点以下0の非表示
-
C#で特定LANアダプタの状態を取...
-
Access グループごとのページ...
-
(Win32)ファイルパスから物理ド...
-
表を表示するコントロールについて
-
PHP declare文について、ticks...
-
URLのパラメータをGETのままで...
-
長い1枚ページを無限スクロール...
-
asp.netでのセッションを使用し...
-
「取得先」という表現について
-
IPアドレス変更方法
-
Cookieを利用したユーザ管理
-
初歩的な質問だと思います。IF...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBA コレクションに2次元配列...
-
VB.NETからVBAマクロ(引数)を呼...
-
どういうプログラムを関数化を...
-
classの再定義エラーについて
-
PHPの名前空間インポートについて
-
PHPでの画像の形式の変換
-
エラーの理由が分りません。Pri...
-
CSVファイルをブラウザのキャッ...
-
PHP、ヒアドキュメント内でのIF...
-
次のhtml・cssでspan内の文字を...
-
PHP正規表現の難題・preg_repla...
-
PHP の system コマンド
-
vb作成したらでbeep音が鳴りま...
-
[C++]std:mapの扱いを教えて頂...
-
file_existsが動作しない
-
UNIX CP "で上書きしません"
-
Type.GetMethodで困っています
-
issetで変数の存在をチェックし...
-
Smarty変数の値をJavascript変...
-
protectedなのにアクセスできな...
おすすめ情報