PHPのラッパー関数について

このQ&Aのポイント
  • PHPのラッパー関数とは、組み込み関数を使って新たな関数を定義する手法です。
  • これにより、コードの再利用性や可読性を高めることができます。
  • また、ラッパー関数を使うことで、組み込み関数をより直感的に扱うことができます。
回答を見る
  • ベストアンサー

PHPのラッパー関数について

御世話になります。 PHPのクラスを作るときに、以下のような、いわゆるラッパー関数というものをよく目にしますが、このようなものをわざわざ定義する意味がよく分かりません。 例えば、ある文字列の両脇からスペースを削除するのに public function Value($string){ return trim($string): } という関数を定義するのと、 trim($string) というPHPの組み込み関数を直接使うのには、どのような違いがあるのでしょうか? またほかの例としては public function allLowerCase($string){ return strtolower(trim($string)); } と strtolower(trim($string)) とはどうでしょうか。 このようなラッパー関数を定義するメリットといったものを、どなたかご説明頂けると有難いのですが。どうかよろしくお願いいたします。

  • PHP
  • 回答数4
  • ありがとう数4

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

  • ベストアンサー
回答No.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()) { // 画面を表示する } みたいな感じで、メソッド名一つでそこで何が起こるのか、何が起きているのか分かりやすく出来きます。

papashiroSooke
質問者

お礼

詳しい説明、本当に有難うございます。 自分は今まではラッパー関数など作ったこともなかったのですが、後々楽になるという事がよくわかりました。 これからは積極的に使ってみようと思います。 それから、1回目のご回答でご指摘いただいた、allLowerCaseメソッドの中身は、私が参考にしている教本では、回答者様の仰る通り public function allLowerCase($string) { return strtolower($this->Value($string)); } となっています。 御世話になりました。ベストアンサーにさせて頂きます。

その他の回答 (3)

回答No.3

記載いただいたものはクラスメソッドのようですが、 クラスの目的("クラス名=目的語"とすることが多い)がなんであるのか、によって、ビジネスロジックとしてどのような名称のどのような機能を作るか、というのも変わってきます。 例えば、クラス名が「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)); } とするべきだなぁと思いました。

papashiroSooke
質問者

お礼

ご回答いただき、有難うございます。 なるほど、ご説明がよく理解できました。 つまり、PHPの組み込み関数を裸で使ってしまうと、プログラムの仕様に変更があった場合、クライアント側でその関数を使っているところをすべて書き換える必要があるが、ラッパー関数にしてあればクラス定義の側で中身を書き換えるだけで、クライアント側には書き換えの必要はない、という理解でよろしいでしょうか?

  • agehage
  • ベストアンサー率22% (2551/11345)
回答No.2

補足を見ました 開発の規模というより経験の差ですかね もっともラッパーが必要なのはデータベースの処理でして、データベースを変更してもプログラムには影響を出さないようにするにはデータベースへのアクセス動作はラッパーにしておかなければなりません これならDBを変更してもプログラム本体は触らなくて済みます こんな風に考えてみると、PHPなどは標準関数の動作がバージョンでコロコロ変わるのも対応できますし、PHPの設定で動作が変わってしまう部分も対応が簡単になります まあ大規模開発なら必ず経験深い人がおりますのでラッパーを作ることになると思いますので、規模の影響もあるといえばあるかもしれません。

papashiroSooke
質問者

お礼

ご回答有難うございます。 仰ることが完全に理解できたとは思いませんが、 「PHPなどは標準関数の動作がバージョンでコロコロ変わるのも対応できますし」 の部分は、自分なりに次のように解釈しました。 つまり、PHPの関数はバージョンで動作が変わることもあるが、ラッパー関数にしてあればクラス定義内のその中身を変更して対応することが出来て、クライアント側から見たそのラッパー関数の使い方には何の変化もなく、PHP関数のバージョンによる変更など気にせずに使える。 この理解でよろしいのでしょうか? お答えいただけると有難いです。

  • agehage
  • ベストアンサー率22% (2551/11345)
回答No.1

例に挙げたような処理ですと、正直いらないのです ただ、最初は「前後のスペースを取りたい」だけだったのが、「前後のスペースを取るが、元の文字列にスペースがあったかどうかログに残したい」なんて要望が出たりします。 そんなときにラッパーにしておくと柔軟に対応出来ます ※スペースがあった場合のログを取りたいと言うのはあくまで例です。普通はそんなのないですよね。あくまで例です。 なのでちょっとした処理をラッパーにすることはあります ではどんな時にラッパーにするの?となりますが、それは制作物や経験により変わってきます

papashiroSooke
質問者

お礼

早速にご回答を頂き、ありがとうございます。 私はバックエンドもフロントエンドも自分一人で会社で使う電気部品のデータベースを作っていますが、大きなプロジェクトで複数の開発者が分散してプログラムを作ったりする場合などだと、このようなラッパー関数のメリットが出てくるのかなと思ったりもしましたが、その様なことはありますか?

関連するQ&A

  • PHPの参照わたしについて

    PHPの参照わたしについて質問です。 例えば、ユーザー定義関数の引数を参照渡しとする場合 function test(&$string){ $string .="参照渡し"; } $aaa = "文字列"; test($aaa); print $aaa; 等とすると、一切値のコピーがおこなわれませんよね? 次に function test($string){ $string . ="参照渡し"; return $string; } $bbb ="文字列"; $ccc = test($bbb); print $ccc; と上記のようにした場合、値のコピーが行われるのは 関数の引数に渡すときと 返り値を返すときの2回行われてるんですかね? もし、値のコピーが二回行われているとするなら 次のようにしたら値のコピーは一度だけ・・・少なくとも上の例よりPHPの動作より 軽い?ものになるのでしょうか・ function &test($string){ $string .= "参照わたし"; return $string; } $ddd = "文字列"; $eee =& test($ccc); //ここで関数の返り値を参照渡しする この場合、値のコピーが行われるのは関数に引数を渡すときの1回だけでしょうか? copy on write による動きは無視しておいて、 オブジェクト指向なプログラムでなくユーザー定義関数であれば このように関数の返り値を参照わたしにした方が、理論的?には早いのでしょうか? この場合、引数も参照渡しにすると破壊的関数になるのでそれは避けたいが、 なるべく値のコピーは防ぎたいという状況だと考えてください。 実際、こんな風にすべてのユーザー定義関数の返り値を参照にして定義するなんてこと おそらくないとおもうのですが、単純にコピーの回数がきになったのです。 よろしく御願いします。

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

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

    • 締切済み
    • PHP
  • PHPの空白除去

    PHP5において 半角の前後空白を削除する関数trimは理解してます。 文字列中にある半角及び全角の空白を除去するには 文字列置換用の関数、例えばstr_replaceを使って置換すれば 全て空白を除去出来ます。 例: ---------------------------------- $string=" あ い う え お "; $all=" ";//全角スペース $half=" ";//半角スペース $no="";//削除用変数 $string=str_replace($all,$no,$string); $string=str_replace($half,$no,$string); ---------------------------------- 最後の2行を書けば置換が出来るのですが、問題はこの二つの関数をまとめてクラス化し、再利用したいと思っています。 クラスの作成方法及び使用方法がまだまだ理解していないので、困ってます。どなたかお力になって頂ければ幸いにございます。

    • ベストアンサー
    • 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
  • phpで関数を定義するfunctionは、なんとい

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

    • ベストアンサー
    • PHP
  • phpで関数の定義について <?php fun

    phpで関数の定義について <?php function say_hello(){ echo "hello world"."\n"; } say_hello(); echoというのはもともと関数ですよね? 関数を定義するとは、関数を新たに作るということですよね? この新たに作った、say_hello();という関数の中に echo "hello world"."\n";という関数を入れてあるということですか?

    • ベストアンサー
    • PHP
  • 関数の引数に未定義の変数を渡すとエラーが出る

    自作の関数で、issetとemptyを一緒に判定する関数を作っているのですがエラーが出ます。 ある変数が「未定義」または「null」または「""(空白)」の場合はnullである、という関数を作りたいです。 ------------------------------------------ function is_null_ex($value){  if (!isset($value)) {return true;}               // 未定義かnullの場合、trueを返す  else if (strlen(strval($value)) === 0) {return true;}   // 空白の場合はtrueを返す  else {return false;}                      // $valueに値が入っている場合はfalseを返す } is_null_ex($val); ------------------------------------------ 上記の関数で$valueが未定義の場合にfuncを使うと、次のようなエラーが出ます。 Notice: Undefined variable: val つまり、未定義の変数を引数に渡すとエラーが出ます。 「未定義なら関数に渡さなければ?」と思うかもしれませんが、そもそもこの関数は「未定義」または「null」または「""(空白)」を判定したい関数なのです。 この場合、どうすれば良いのでしょうか? エラーは出ますが上記の関数で「if (!isset($value)) {return true;}」の部分できちんと判定はされています。 PHP5.3系で運用しています。 ぞうぞよろしくお願い致します。

    • ベストアンサー
    • PHP
  • PHPのpack関数をJavaで実装できるのでしょうか

    PHPで文字列を16進バイナリ文字列に変換する関数であるpack関数というものがありますが、これと全く同じ動きをしてくれるメソッドがjavaには存在しないようです。これを自分で実装する方法をあれこれ考えているのですが、どうしてもうまくいきません。 下のようなメソッドを作ってみたのですが、戻ってくるのはただの数値文字列です。 /** * @param toPack バイナリへの変換対象の数値 */ String getHexBinary(int toPack){ String buf = ""; String hex = Integer.toString(toPack, 16); char decChars[] = hex.toCharArray(); for(int decChar : decChars){ buf += Integer.toHexString(decChar); } return buf; } PHPのpack関数はこの戻ってくる数値文字列を何らかの手法で結合しているように見えるのですが、その挙動が理解できずに困っています。どなたか、ご教授願えないでしょうか。ちなみに、Javaのバージョンは5.0でやっています。PHPのバージョンは5.2です。

    • ベストアンサー
    • Java
  • php Undefined variableエラー

    下記ファイルを実行した際、Notice: Undefined variable: pElement in C:\xampp\htdocs\scrape_func.php on line 31とエラーが出てしまいます。どこに問題がありますでしょうか?初歩的な質問かと思いますが、よろしくお願い致します。 <?php /* スパイダリング関数群のインクルード */ include( "scrape_func.php" ); /* getURL関数を使用して、ページの生データを取得する。 */ $_rawData = getURL( "http://www.oreilly.co.jp/catalog/soon.shtml" ); /* 生データをutf-8に変換する。 */ $_rawData = mb_convert_encoding($_rawData, "UTF-8", "auto"); /* 解析しやすいよう、生データを正規化する。 */ $_rawData = cleanString( $_rawData ); /* 次は若干ややこしい。 必要な項目の開始部分と終了部分は、事前にhtmlから確認してある。こういったものを利用して必要なデータを取得する。 */ $_rawData = getBlock( "<font COLOR=\"#80000\">", "</td></tr>", $_rawData ); /* これで箇条書きに必要な特定データを入手できた。ここでは項目を配列化した後、繰り返しによって、処理を行っている。 */ $_rawData = explode( "<P>", $_rawData ); /* 繰り返しを行いながら、個々の項目を解析する。 */ foreach( $_rawData as $_rawBlock ) { $_item = array(); $_rawBlock = trim( $_rawBlock ); if( strlen( $_rawBlock ) > 0 ) { /* 番兵を最後尾に付加する */ $_rawBlock = $_rawBlock . "<P>"; /* 項目のタイトルは<DD class="title"> ... <p>間にある。 */ $_item[ "title" ] = strip_tags( getBlock( "<DD class=\"title\">", "p", $_rawBlock ) ); /* ISBNは<DT>と<DDの間にある。 */ $_item[ "isbn" ] = getBlock( "<DT>", "<DD>", $_rawBlock, false ); /* スパイダリンした結果を表示する */ print( implode( chr(10), $_item ) . chr(10) . chr(10) ); /* 文字列として保存する (後述するメールの例で使用。) */ $_text .= implode( chr(10), $_item ) .chr(10) . chr(10); } } ?> scrape_func.php <?php function getURL( $pURL ) { $_data = null; if( $_http = fopen( $pURL, "r" ) ) { while( !feof( $_http ) ) { $_data .= fgets( $_http,1024 ); } fclose( $_http ); } return( $_data ); } function cleanString( $pString ) { $_data = str_replace( array( chr(10), chr(13), chr(9) ), chr(32), $pString ); while( strpos( $_data, str_repeat( chr(32), 2 ), 0 ) != false ) { $_data = str_replace( str_repeat( chr(32), 2 ),chr(32), $_data ); } return( trim( $_data ) ); } function getBlock( $pStart, $pStop, $pSource, $pPrefix = true ) { $_data = null; $_start = strpos( strtolower( $pSource ), strtolower( $pStart ), 0 ); $_start = ( $pPrefix == false ) ? $_start + strlen( $pStart ) : $_start; $_stop = strpos( strtolower( $pSource ), strtolower( $pStop ), $_start ); if($_start > strlen( $pElement ) && $_stop > $_start ){ $_data = trim( substr( $pSource, $_start, $_stop - $_start )); } return( $_data ); } function getElement( $pElement, $pSource ) { $_data = null; $pElement = strtolower( $pElement ); $_start = strpos( strtolower( $pSource ), chr(60) . $pElement, 0 ); $_start = strpos( strtolower( $pSource ), "</" . $pElement . chr(62), $_start ); if( $_start > strlen( $pElement ) && $_stop > $_start ) { $_data = trim( substr( $pSource, $_start, $_stop - $_start ) ); } return( $_data ); } ?>

    • ベストアンサー
    • PHP
  • phpでこの場合、calだけが関数の定義をされたん

    phpでこの場合、calだけが関数の定義をされたんですか?それともcal($x)までが関数の定義をされたんですか? <?php function cal($x) { echo ($x *3)."\n"; }; cal(6);

    • ベストアンサー
    • PHP

専門家に質問してみよう