あーる学習帳

自分が勉強したことや気になることなど、99%自分用です。コードを書いてるのでPCから閲覧を推奨。

PHP実習:関数の自作とローカル変数、グローバル変数

先ほどのファイル読み書きのところが少ないように感じたのと、今夜はモチベーションが高いのでもう少し続けます。

 

第11章-01

この章ではいよいよ関数を自作する。そもそも関数とは、コードの一連の処理をまとめて定義すること。必要な値を渡したり返したりする仕組みが存在していて、自作した関数を何度も使いまわすことができる。仕事でもお世話になってます。

PHPの関数について、基本的な構文は以下の通りとなる。

function 【関数名】(引数1,引数2,...){

 //一連の処理

 //必要なら値を返す(Return)

関数名はPHPマニュアルの「命名の手引き」に乗っ取って、単語の間にアンダースコアを使用する「スネークケース」という方法を用いることにする。大文字を使わず、単語と単語の間に_を使うので「some_code_name」という形になる。

例として、以前扱ったhtmlspecialchars()を関数に組み込んで使う。

<?php
 function html_escape($word){
  return htmlspecialchars($word,ENT_QUOTES,'UTF-8');
 }

 $word='<h1>こんにちは</h1>';
 echo $word;
 echo html_escape($word);

f:id:R_de_aru:20180705212332p:plain

このように、関数を通すとhtmlspecialcharsの処理を行った文字列を返り値として表示することが分かる。

よく起こる関数の勘違いとして以下のコードが挙げられる。

<?php

$word='<h1>こんにちは</h1>';
echo html_escape($word); // 1.関数の宣言前に呼び出す
function html_escape($str){ // 2.$wordと別の名前の変数にする
 return htmlspecialchars($str,ENT_QUOTES,'UTF-8');
}

 これは正常に動作するコードである。

  1. PHPを実行する際、裏でコンパイルを行って人が理解できる言語から機会が理解できる言語へ変換を行っている。関数の存在はこの時確認するので、実行時にはコンピューター側がhtml_escape()を知っている状態であるためOK。
  2. 関数を呼び出すときは変数をそのまま渡すのではなく、中身のデータだけを渡して新たに$strという変数に詰めなおしている。変数名は揃えなくてもよい。

 

第11章-02

引数は複数設定可能、デフォルト値の設定も可能である。

<?php
function show_member($member1,$member2,$leader='田中'){
 echo '今回のメンバーは'.$member1.'さんと'.$member2.'さんです。<br>';
 echo $leader.'さんが現場を管理します。';
}
show_member('高橋','小林') 

 この関数には3つの引数が設定されているので本来ならばエラーになるが、第3引数にデフォルト値を設定している。そのため、第3引数に何も渡されていないときは「田中」が自動的に入ることになる。

戻り値に複数の値を返すことも可能である。配列を使う。

<?php
function get_sum_and_diff($inti,$int2){
 $sum=$int1+$int2;
 $difference=$int1-$int2;
 return array($sum,$difference);
}
$int1=8;
$int2=3;
list($sum,$difference)=get_sum_and_diff($int1,$int2);
echo $sum,'<br>';
echo $difference; 

 引き算の答えもreturnする。この場合、一度$sumとともに配列に格納する。関数使用時にそのまま配列として取得することも可能だが、今回はlist()を使う。これは添え字配列を一度に複数の変数に代入するコードであり、配列に格納した順番にlist()の方でも変数を指定すれば一度に複数の代入が行える。

 

第11章-03

変数には有効範囲があり、「スコープ」という。以下のコードのうち、いくつかはvar_dump()でundefined(プログラムがその存在を認識していない)というエラーが出る。

<?php
function hello_message($name){
 $now=date('H:i:s');
 echo 'はじめまして'.$name.'さん '.$now;

 var_dump($word); // A
 var_dump($now); // B
 var_dump($name); // C
}

$word='太郎';
hello_message($word);

var_dump($word); // D
var_dump($now); // E
var_dump($name); // F

 関数内で使われる変数をローカル変数といい、関数の中だけで認識される。$wordで作成された変数はグローバル変数といい、関数外で認識される。

Aは関数の中で$wordが宣言されておらず、E、Fについては関数の外で宣言されていないのでundefinedが発生する。

 

明日は関数専用のphpファイル作成と実習を行う。今夜はここまで。