php ユーザー定義関数(PHP)

2013年11月17日

PHP でのユーザー定義関数に関する基本的な事項のメモ。

ユーザー定義関数の構文

function 関数名 (引数...) {
        処理するコード
        return 戻り値;
}

ユーザー定義関数( h() )の例

次の関数(htmlspecialchars)のパラメータを毎回指定しなくても良いようにする例。また関数名も長いので短くすることで記述が簡単になる。

string htmlspecialchars ( $string, $flags, $encoding, $double_encode)
特殊文字を HTML エンティティに変換する。文字の中には HTML において特殊な意味を持つものがあり、 それらの本来の値を表示したければ HTML の表現形式に変換してやらなければならない。 この関数は、これらの変換を行った結果の文字列を返す。
$string:変換される文字列
$flags: デフォルトは ENT_COMPAT または ENT_HTML401。
代表的な flags 定数は以下のとおり。
ENT_COMPAT ダブルクオートは変換するがシングルクオートは変換しない。
ENT_QUOTES シングルクオートとダブルクオートを共に変換する。
ENT_NOQUOTES シングルクオートとダブルクオートは共に変換されない。
$encoding:変換に使用されるエンコーディングを指定。 省略した場合のデフォルト値は、PHP 5.4.0 より前のバージョンでは ISO-8859-1、 PHP 5.4.0 以降では UTF-8
$double_encode:double_encode をオフにすると、PHP は既存の html エンティティをエンコードしまない。 デフォルトでは、既存のエンティティも含めてすべてを変換する。

以下のように定義しておけば、上記の関数は「h(変換される文字列)」で呼び出せる。

<?php   
function h($var) {
  $html = htmlspecialchars($var, ENT_QUOTES, 'UTF-8');
  return $html;
}

echo  h('HTMLでは < は &lt; と記述します。');

変数のスコープ

変数には、その変数が有効な(利用できる)範囲があり、それを「変数のスコープ」という。

  • 通常の変数はプログラムのどこでも有効で、これを「グローバル変数」という
  • 関数定義内にある変数は、その関数の定義内でしか有効ではなく、これを「ローカル変数」という
  • $_GET, $_COOKIEなどは、関数定義内でも有効で、これを「スーパーグローバル変数」という

可変変数

可変変数とは、「変数名を変数によって決める」ことができる変数。可変変数では、先頭に「$」を2つ重ねることで、変数名を別の変数値で動的に決定できる。

<?php
$x = 'title';
$title = 'PHP:Hypertext Preprocessor';
print($$x);    //PHP:Hypertext Preprocessorと表示される
//可変変数 $$x は、$x の内容が評価(展開)された結果、$title と同じ意味になる
?>

2番めの引数($data)が配列の場合の例。

function display($_template, $data) {
    foreach($data as $key => $val) {
        $$key = $val;    //$keyが'title'だとすると $title = $val となる
    }
    ....(省略)
}

前述のユーザー定義関す「h($var)」で、引数に配列が渡されても処理できるようにするには以下のようにすると可能。

function h($var){
  if(is_array($val)){
     return array_map('h', $var);    
     //$varが配列の場合、h()関数をそれぞれの要素について呼び出す(再帰)
  }else{
    return htmlspecialchars($var, ENT_QUOTES, 'UTF-8');
  }
}
bool is_array ( mixed $var )
変数が配列かどうかを検査する
mixed $var: 評価する変数
戻り値:var が 配列型 の場合 TRUE、 そうでない場合 FALSE を返す
array array_map ( callable $callback , array $arr)
指定した配列の要素にコールバック関数を適用する
callable $callback:配列の各要素に適用するコールバック関数
array $arr:コールバック関数を適用する配列
戻り値:arr の各要素に callback 関数を適用した後、 その全ての要素を含む配列を返す