- ベストアンサー
PHPのラッパー関数について
- PHPのラッパー関数とは、組み込み関数を使って新たな関数を定義する手法です。
- これにより、コードの再利用性や可読性を高めることができます。
- また、ラッパー関数を使うことで、組み込み関数をより直感的に扱うことができます。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
はい、捕捉に記載いただいた理解でばっちりです。 後はよくあるパターンで、標準関数が長すぎるので短くする、とかデバッグ用途で使うので、簡単にアクセスできるようにしたい、とか、そういうのがあります。 // HTMLエスケープする関数が長すぎる。。。 function h($value) { return htmlspecialchars($value, ENT_QUOTES, 'UTF-8'); } // 古式ゆかしいデバッグechoを簡単にできるようにしたい function e($value) { echo $value . '<br>'; } // 先に回答されていたagehage様の言っているようなDBアクセス function db_connect() { // 定数値を読んで接続先を決定して返す() return new PDO(SOME_DSN_CONST); } みたいな。 他に補足するならば、ラッパー関数やクラス/メソッドを作るときは、プログラム的に何がやりたいか、よりもビジネスロジック的に何がやりたいか、で名前を付けると割とベターなんじゃないかって思います。 例題)メンバ変数$flagが、真のとき、画面を表示することができる 作成例1)プログラムべた書き if ($sumObj->flag) { // 画面を表示する } 作成例2)メソッドを切る ---someObjのメソッドを以下のように定義 public function isFlag() { return $this->flag === true; } ---- if ($someObj->isFlag()) { // 画面を表示する } 作成例3)メソッドをビジネスロジック的になんなのかがわかる名称にする ---someObjのメソッドを以下のように定義 public function canDisplay() { return $this->flag === true; } --- if ($someObj->canDisplay()) { // 画面を表示する } みたいな感じで、メソッド名一つでそこで何が起こるのか、何が起きているのか分かりやすく出来きます。
その他の回答 (3)
- hogehoge78
- ベストアンサー率80% (433/539)
記載いただいたものはクラスメソッドのようですが、 クラスの目的("クラス名=目的語"とすることが多い)がなんであるのか、によって、ビジネスロジックとしてどのような名称のどのような機能を作るか、というのも変わってきます。 例えば、クラス名が「NormalizeValue」とかといった名前だったとしたら、「値を、標準化、正常化」するのが目的ですので、 Valueメソッドの場合 ・単一の値を標準化する ・標準化とは前後のスペースなどを削除した値であること という役割が与えらえるものと考えられます。 その際、現状では前後のスペースを削除することだけが仕様として決まっているのでそう書いてありますが、Valueメソッドの「標準化」の仕様が変更された場合にはその中にもっと細かい記述がなされることになります。 また、逆にいちいち標準化するクラス、といったようなユーティリティを使う意味がないのでPHP関数を直接使うこととすると、例えば、 <?php $value1 = trim($_POST['value1']); $value2 = trim($_POST['value2']); $value3 = trim($_POST['value3']); $value4 = trim($_POST['value4']); ?> というようなスクリプトを書くことになりますが、もし「標準化は、前後の半角スペース以外にも、全角スペースも削除するようにすること」と要件が変わった場合、 <?php $value1 = preg_replace('/^[\s ]+/', '', $_POST['value1']); $value1 = preg_replace('/[\s ]+$/', '', $value1); $value2 = preg_replace('/^[\s ]+/', '', $_POST['value2']); $value2 = preg_replace('/[\s ]+$/', '', $value2); $value3 = preg_replace('/^[\s ]+/', '', $_POST['value3']); $value3 = preg_replace('/[\s ]+$/', '', $value3); $value4 = preg_replace('/^[\s ]+/', '', $_POST['value4']); $value4 = preg_replace('/[\s ]+$/', '', $value4); ?> とか書き換える必要が出てきます。(上の記述がきれい汚いはさておいて) これを、NormalizeValueクラスのValueメソッドで処理をする、ということに置き換えてみれば、 <?php $n = new NormalizeValue(); $value1 = $n->Value($_POST['value1']); $value2 = $n->Value($_POST['value1']); $value3 = $n->Value($_POST['value1']); $value4 = $n->Value($_POST['value1']); ?> となり、Valueメソッド(使われる側)の中身を書き換えれば、上記のような例(使う側)は、変更する必要がなくなって、楽になります。 余談ですが、allLowerCaseメソッドの中身は、 public function allLowerCase($string) { return strtolower($this->Value($string)); } とするべきだなぁと思いました。
お礼
ご回答いただき、有難うございます。 なるほど、ご説明がよく理解できました。 つまり、PHPの組み込み関数を裸で使ってしまうと、プログラムの仕様に変更があった場合、クライアント側でその関数を使っているところをすべて書き換える必要があるが、ラッパー関数にしてあればクラス定義の側で中身を書き換えるだけで、クライアント側には書き換えの必要はない、という理解でよろしいでしょうか?
- agehage
- ベストアンサー率22% (2752/12072)
補足を見ました 開発の規模というより経験の差ですかね もっともラッパーが必要なのはデータベースの処理でして、データベースを変更してもプログラムには影響を出さないようにするにはデータベースへのアクセス動作はラッパーにしておかなければなりません これならDBを変更してもプログラム本体は触らなくて済みます こんな風に考えてみると、PHPなどは標準関数の動作がバージョンでコロコロ変わるのも対応できますし、PHPの設定で動作が変わってしまう部分も対応が簡単になります まあ大規模開発なら必ず経験深い人がおりますのでラッパーを作ることになると思いますので、規模の影響もあるといえばあるかもしれません。
お礼
ご回答有難うございます。 仰ることが完全に理解できたとは思いませんが、 「PHPなどは標準関数の動作がバージョンでコロコロ変わるのも対応できますし」 の部分は、自分なりに次のように解釈しました。 つまり、PHPの関数はバージョンで動作が変わることもあるが、ラッパー関数にしてあればクラス定義内のその中身を変更して対応することが出来て、クライアント側から見たそのラッパー関数の使い方には何の変化もなく、PHP関数のバージョンによる変更など気にせずに使える。 この理解でよろしいのでしょうか? お答えいただけると有難いです。
- agehage
- ベストアンサー率22% (2752/12072)
例に挙げたような処理ですと、正直いらないのです ただ、最初は「前後のスペースを取りたい」だけだったのが、「前後のスペースを取るが、元の文字列にスペースがあったかどうかログに残したい」なんて要望が出たりします。 そんなときにラッパーにしておくと柔軟に対応出来ます ※スペースがあった場合のログを取りたいと言うのはあくまで例です。普通はそんなのないですよね。あくまで例です。 なのでちょっとした処理をラッパーにすることはあります ではどんな時にラッパーにするの?となりますが、それは制作物や経験により変わってきます
お礼
早速にご回答を頂き、ありがとうございます。 私はバックエンドもフロントエンドも自分一人で会社で使う電気部品のデータベースを作っていますが、大きなプロジェクトで複数の開発者が分散してプログラムを作ったりする場合などだと、このようなラッパー関数のメリットが出てくるのかなと思ったりもしましたが、その様なことはありますか?
お礼
詳しい説明、本当に有難うございます。 自分は今まではラッパー関数など作ったこともなかったのですが、後々楽になるという事がよくわかりました。 これからは積極的に使ってみようと思います。 それから、1回目のご回答でご指摘いただいた、allLowerCaseメソッドの中身は、私が参考にしている教本では、回答者様の仰る通り public function allLowerCase($string) { return strtolower($this->Value($string)); } となっています。 御世話になりました。ベストアンサーにさせて頂きます。