PHP For Beginnersチュートリアル　その9　PHP関数の基本

##このシリーズの目的

体系的なwebコーディングの訓練ができるようになるために、PHPの初学のきっかけかつ、PHPでログインフォームやフォームを実装することができるようになるために

[PHP For Beginners](https://www.youtube.com/playlist?list=PLgt-G5tEOlKX4LKrBCYfjcyrp7wmnRdAL)

上記のチュートリアルを進めているのでその備忘録。

[前回](https://qiita.com/shitikakei/items/841a43ce58dec500b4e0)

##内容

**今回のチュートリアル**

[PHP Tutorial For Beginners: PHP Functions](https://www.youtube.com/watch?v=bZrEbiYuMeg&list=PLgt-G5tEOlKX4LKrBCYfjcyrp7wmnRdAL&index=10)

**このチュートリアルでやること**

・PHPの関数について基本の振り返り。


**成果物**

```php:基本

<?php 

function test () {

	echo "hello";

}

test();

 ?>

/*ここまでやってきていればこれはわかるはず。
funcition 関数名()の形で中に実行する処理を書き、関数名()で呼び出すことで処理を実行するのが基本。
*/
 
```

```php:引数を設定する

<?php 

function sum ($num1,$num2) {

	echo $num1+$num2;
	echo "<br>";

}

sum(5,7);
sum(6,7);
sum(1,50);

 ?> 

/*関数を定義する際に引数に変数を設定すると、呼び出す時は値を入れるだけで代入して処理してくれる。
上から順に12,13,51と出力される。


ちなみに以下のようにすると呼び出す時に第2引数を省略できる。*/

 <?php 

function sum ($num1,$num2=0) {

	echo $num1+$num2;
	echo "<br>";

}

sum(5);
sum(6);
sum(1);

 ?> 

/*出力結果は上から順に5,6,1となる。
しかし、第1引数は省略できないので以下の場合はエラーになる。
*/



<?php

function sum ($num1=0,$num2) {

	echo $num1+$num2;
	echo "<br>";

}

sum(,5);
sum(,7);
sum(,1);

 ?>

```
```php:関数内の変数へのアクセス

/*
以下の関数の出力結果は30となる。
*/

<?php

function sum ($num1=0,$num2) {

	echo $num1 + $num2;
	echo "<br>";

}

$n1 = 10;
$n2 = 20;
sum($n1+$n2);
 ?>

/*ところが下の2つはエラーとなる。*/

<?php

function sum ($num1=0,$num2) {

	$total = $num1 + $num2;

}

$n1 = 10;
$n2 = 20;
sum($n1+$n2);
echo $total;
 ?>

<?php

$n1 = 10;
$n2 = 20;

function sum () {

	echo $n1 + $n2;

}

sum($n1,$n2);

 ?>

/*なぜエラーになるのかというと、関数の中の変数には外からはアクセスできないのが仕様だからである。
これはクラスやオブジェクトにも同じことがいえる基本的な考え方なので覚えておく。
では、アクセスさせるにはどうすればいいのか？
以下のようにするのが正解。globalでglobal変数に設定してやる。
global変数に指定した場合、下記のように関数内で変数の値が差し替えられた場合、元の変数の値も差し替わる。
なので、出力結果は
34
14
となる。
*/


<?php

$n1 = 10;
$n2 = 20;

function sum () {

	global $n1,$n2;
	$n1=14;
	echo $n1 + $n2;
        echo "<br>"

}

sum($n1,$n2);
echo $n1;

 ?>

/*ちなみに、グローバル関数を関数内で使わずに変数を渡すにはリファレンスをする。
以下のように関数の引数に設定した変数に&をつけることで関数外の変数を渡すことができる。
つまり、この場合
$num1=$n1
$num2=$n2
となってから、関数内で$num1=14になるという処理がなされるので
結果後で呼び出す時に、$n1と$n2を引数に設定しても結果は30とならずに34となり、$n1は10ではなく、14になる。*/

<?php

$n1 = 10;
$n2 = 20;

function sum (&$num1,&$num2) {

	$num1=14;
	echo $num1 + $num2;

}

sum($n1,$n2);
echo $n1;

 ?>
```

```php:再帰関数

/*定義した関数をその関数の中で呼び出す手法。
処理的にはループ処理になるので実際にこういう書き方はしないが、考え方を覚えておく。*/

<?php

$n1 = 10;
$n2 = 20;

function sum ($start,$end,$max) {

	if($start < $max) {
		$start += $end;
		echo $start."<br>";
		sum($start, $end, $max);

	}

}

sum(0,10,100);

 ?>
```

```php:値を返すことについて

/*以下の場合、何も出力されない。
なぜなら呼び出した関数では変数に代入をしているところで終わっているからである。*/

<?php

$n1 = 10;
$n2 = 20;

function sum ($num1,$num2) {

	$total= $num1 + $num2;
}

echo sum(5,10);

 ?>

/*なので、以下のようにreturnで値を返してやる必要がある。*/


<?php

$n1 = 10;
$n2 = 20;

function sum ($num1,$num2) {

	$total= $num1 + $num2;
	return $total;

}

echo sum(5,10);

 ?>

/*では、連想配列の場合はどうか以下の例で見てみる*/

<?php

function sumAndMultiplyByTen ($num1,$num2) {

	$total= $num1 + $num2;
	$response = array($total,$total*10);
	return $response;

}

echo sumAndMultiplyByTen(5,10);

 ?>

/*このままではエラーが出る。
戻り値は$responseに返されているがechoは文字列を出力する関数だからだ。
なので、呼び出した関数を変数に代入し、それを呼び出す出力するために配列を出力する関数を用いればいい。
つまり*/

<?php

function sumAndMultiplyByTen ($num1,$num2) {

	$total= $num1 + $num2;
	$response = array($total,$total*10);
	return $response;

}

$returnValue = sumAndMultiplyByTen(5,10);
var_dump($returnValue);

 ?>

/*こうしてやればいいということである。
var_dumpの他にはprint_rなどもある。
余談であるが、配列のうちの任意の値を出力したいだけならechoでもできる。その場合例えば今回の場合は最後を

echo $returnValue[0];

としてやると、15と出力される。*/