制御構造と関数
<?php
if(isset($name)){
?>
<p><?php echo $name; ?></p>
<?php
}
?>
こういうのもあり。
■if文
・開始のカッコ{ はコロン:にもできる。
・終了のカッコ} はend if; にもできる。
他にもswitch , while , for , foreachもendforとかにできる。
■while 、do whileの違い
・whileは最初に条件判断してループするかどうか決める。
・do whileはまずdoする。つまり一回はループに入る。
書き方
do {
echo $i;
$i++;
} while ($i<10);
■foreach
あんま使ったことないからメモ
foreach(反復可能なデータ構造 as 要素)
例
$array = array(1,2,3,4,5,);
foreach($array as $value){
echo $value;
}
ちなみに配列のキーも指定可能
$fruits_color = array(
'apple' => 'red',
'banana' => 'yellow',
'orange' => 'orange',
);
foreach($fruits_color as $name => $color){
echo "$name is $color";
}
ちなみに2 要素の参照もできる。&つけて。
$fruits_color = array(
'apple' => 'red',
'banana' => 'yellow',
'orange' => 'orange',
);
foreach($fruits_color as &$color){
$color = 'black';
}
※これで要素の中身が全部blackになるが、推奨されていない。
※あくまで参照だが、ブロック抜けても参照を持ち続けるためこの後の処理で思わぬ事態が起こる可能性あり。
foreachブロック抜けた後に
unset($color);
として参照を解除するのがベスト。
■break文
適当に break; とかくだけ。処理を抜ける。
■continue
繰り返しを終えて次の繰り返しに行く。
■exit
exit; とかいたらプログラムが終わる。
■requireとrequire_onceの違い
require 一度読み込んだファイルをもう一度読み込める。
require_onece 一度読み込んだファイルを二度と読み出せない。
※読み込むファイルなしの場合はfetal error
※同じ名前のクラスを二度定義できない場合、
つまり一度しか読み込む必要のないファイルはrequire_once。
例
require_once 'SomeLib.php';
$obj = new SomeLib(); //読んだファイルに定義されてるクラスを利用できる。
■include / include_once
requireとかと同じく外部ファイル読み込み。
上との違いはファイルが存在しない場合もエラーにならずに実行は継続する。
(warningとなり警告して実行は継続)
■goto
基本使わないけど一応メモ。エラーなど例外のとき使うかも。
goto error;
error:echo "エラーです";
exit(1);
■関数とは
再利用されるコードやひとかたまりのロジックをまとめて定義してるやつ。
function add($v1,$v2){
$answer=$v1+$v2;
return $answer;
}
$v3=add(1,2);
引数にはデフォルト値もOK
function hello($name,$greeting='hello'){
echo $greeting,$name;
}
hello('bob','good moring');
hello('tom');
※ただしデフォルト値をもつ引数は必ず順番として後にかかないとダメ。
■タイプヒンティング
本来PHPでは関数の引数に型を指定しないのでなんでもOKだが、
あえて指定することもできる。
function array_output(array $var){..... //こうすると配列じゃない場合にエラーとなる。
■高度な関数
call_user_func() / call_user_funcarray()
第一引数に指定した関数を呼び出し、結果を返す。
function add($v1,$v2){
return $v1+$v2;
}
class Math{
public function sub($v1,$v2){
return $v1-$v2;
}
public static function add($v1,$v2){
return $v1+$v2;
}
}
call_user_func('add',1,2); //3
call_user_func(function($v1,$v2) { return $v1+$v2; } ,1,2); //3 無名関数指定可能
call_user_func(array('Math','add') , 1 , 2); //3 staticメソッドの場合、クラス名を文字列指定可能
call_user_func('Math :: add',1,2); //3 staticメソッドの場合、クラス名::メソッド名という文字列指定可能
$math=new Math();
call_user_func(array($math,'sub'), 1 , 2); //-1 インスタンス変数メソッド名指定
call_user_func_array('add' , array(1,2)); //3 第二引数に配列で引数のリスト指定
call_user_func_array(array($math, 'sub'),array(1,2)); //-1 同上
■参照
function add_one(&$value){
$value +=1;
}
$a=10;
add_one($a); //11
※必ず変数じゃないとだめ。
ちなみに関数の前に&つけると返り値も参照できる。
function &add_one(&$value){
$value +=1;
return $value;
}
$a=10;
$b =& add_one($a);
$b+=1;
echo $a; //12 $bに1をたしたが、$aも1が足されている。
■無名関数
名前がない関数。いちいち名前月でグローバルに定義しなくてよいメリット。
$my_pow = function($times =2){
return function($v) use (&$times){
return pow($v, $times);
};
};
$cube=$my_pow(3); //3乗を行う関数が定義される
echo $cube(2); //8
下記がかなり分かりやすかった。