PHP にちょっと触れてみたので書いとく

Ruby を少し齧った人間が PHP に触れてみたので後で見返すように書きました。
### php タグ
PHP のコードは`<?php` と `?>`の中に書く

```php
<?php
$name = "伊藤";
print($name);
?>
```
HTMLに埋め込むのではなく、独立したファイルに PHP のコードを保存する場合は末尾の `?>` は省略することができる。終端の `?>` の後に改行文字などがあると予期せぬ不具合の元になる為、省略することを推奨されている。

```php
<?php
$name = "伊藤";
print($name);
```
### 文の区切り文字
文の末尾には`;`が必要

```php
$name = "神山"
// ; が抜けているのでダメ
```

### 文字列の連結
```php
"Hello " . "world";
// "Hello world"
```
## 変数の宣言
```php
// 変数は先頭に`$`が必要
$message = "hello";
```
### 出力
Rubyの puts などのように引数の文字列を出力する

```php
var_dump($message);
// var_dump は型などが表示されるのでデバッグ用に使う
echo "hello";
print "world";
```

### 入力
```php
// Ruby の gets のように標準入力から文字列を受け取る
print("入力してください");
$input = fgets(STDIN);
print($input);
// Ruby の gets 同様に改行文字が含まれる。 trim 関数を使って前後の空白文字を除去する
print("入力してください");
$input = trim(fgets(STDIN));
print($input);
```
### PHPのbool値
PHPマニュアルよりの引用です。
>boolean に変換する場合、次の値は FALSE とみなされます。
>boolean の FALSE
integer の 0 および -0 (ゼロ)
float の 0.0 および -0.0 (ゼロ)
空の文字列、 および文字列の "0"
要素の数がゼロである 配列
特別な値 NULL (値がセットされていない変数を含む)
空のタグから作成された SimpleXML オブジェクト

上記以外は TRUE と見なされます。

### 条件分岐
if 文は条件式の()を省略できない。また PHP の条件分岐は if **文**なので、Ruby のように代入文の右側に置くとエラーになる

```php
if ($age >= 20) {
  print("成人です");
}else {
  print("未成年です");
}

//HTMLに埋め込む
<?php if($age >= 20): ?>
  <div>成人です</div>
<?php else: ?>
  <div>未成年です</div>
<?php endif; ?>
```

### 配列
```php
//宣言
$week1 = ["月", "火", "水"];
$week2 = ["木", "金", "土"];
// 要素の型は揃っていなくても良い
$any_type = ["なんでもいいよ", 100, 1.14, true];

//末尾の要素を取り出す
$wday1 = array_pop($week1);
//"水"

//先頭の要素を取り出す
$wday2 = array_shift($week2);
//"木"

//配列の末尾に要素を追加する
array_push($week1, $wday1);
//["月", "火", "水"]
array_push($week1, $wday2);
//["月", "火", "水", "木"]

//複数の配列をつなぎ合わせる
$week = array_merge($week1, $week2);
// ["月", "火", "水", "木", "金", "土"]

//配列の要素を逆順にした配列を返す
array_reverse($week);
// ["土", "金", "木", "水", "火", "月"]
```

### range関数
```php
// range(開始値, 終了値)
range(0, 5)
// [0, 1, 2, 3, 4, 5] の配列を返す
// Ruby の 1..5 のようなもの？
```

### foreach 文
配列から要素を先頭から一つづつ取り出し、ブロック内の処理を適用する。Ruby の foreach メソッドとほぼ同じ。

```php
$week = ["月", "火", "水", "木", "金", "土"];
foreach ($week as $day) {
  print("今日は" . $day . "曜日\n");
}
```
### while 文
条件式の`(` `)`は省略不可

```php
$money = 30000;

while($money >= 0) {
  print("あと" . $money . "円\n");
  $money -= 3300;
}
```

### for 文
```php
for($money = 30000; $money >= 0; $money -= 3300){
  print("あと" . $money . "円\n");
}
``` 
### 関数の定義
```php
function 関数名(引数) {
  関数の処理本体
  return 返り値
}
//関数定義
function addNum ($x, $y) {
  return($x + $y);
}

//関数呼び出し
print(addNum(2,4));
//6
```

### ヒアドキュメント
```php
変数 <<< EOM
複数行の
文章を
書く
EOM;

function createMessage($name, $price) {
  $msg = <<< EOM
{$name}様、ご注文を承りました。
ご注文の代金は合計、{$price}円です。\n
EOM;
  echo $msg;
}

createMessage("伊藤", 300000);
createMessage("高崎", 3000);
//string(89) "伊藤様、ご注文を承りました。
//ご注文の代金は合計300000円です。"

//string(87) "高崎様、ご注文を承りました。
//ご注文の代金は合計3000円です。"
```

### 連想配列
Ruby の hash のようにキーと値の組でデータを保持する
連想配列の宣言 `{``}` ではなく `[``]` で括ることに注意

```php
$member = ["name" => "伊藤", "nickname" => "テストマスター"];
$member["name"];
// ”伊藤”
$member["point"];
// 80

//入れ子にもできる
$members = [
  ["name" => "伊藤", "nickname" => "テストマスター"],
  ["name" => "高崎", "nickname" => "スクラムマスター"]
];
$members[1]["name"];
// "高崎"
```

### 外部ファイルを読み込む
```php
// 読み込まれる側の記述は今まで通り
//sampleFunc.php
function createMessage($name, $price) {
  $msg = <<< EOM
{$name}様、ご注文を承りました。
ご注文の代金は合計{$price}円です。\n
EOM;
  echo $msg;
}

function getPrice($cnt) {
  return 500 * $cnt;
}

// 読み込む側は宣言が必要
require_once __DIR__ ."/sampleFunc.php";

$orders = [
  ["name" => "伊藤", "cnt" => 300000],
  ["name" => "高崎", "cnt" => 300],
  ["name" => "神山", "cnt" => 200],
  ["name" => "服部", "cnt" =>180]
];

// 外部ファイル内の関数 getPrice(), createMessage() を呼び出している
foreach($orders as $order) {
  $price = getPrice($order["cnt"]);
  createMessage($order["name"], $price);
}
// 伊藤様、ご注文を承りました。
// ご注文の代金は合計150000000円です。
// 高崎様、ご注文を承りました。
// ご注文の代金は合計150000円です。
// 神山様、ご注文を承りました。
// ご注文の代金は合計100000円です。
// 服部様、ご注文を承りました。
// ご注文の代金は合計90000円です。
```