PHP 基礎文法

# 前提

PHPの復習的備忘録となります。
間違い等あればご指摘ください。

# 基礎

```php:基礎
<?php  
  // コード記述
> // 閉じタグはHTMLと同時記載しない場合は不要

//　 〜コメント
# 　〜コメント（行末まで）
/* 　範囲コメント 　*/

// 変数
$変数名 = 変数;

//　出力
echo 'hello world' . PHP_EOL;
// .　ピリオドで連結　PHP_EOLは改行
// " ' を使い分け('使用時は”で囲む）
$w = 'world';
echo "hello $w" . PHP_EOL; // hello world
echo "It's \"Friday\".\tHello $w " . PHP_EOL;
// 内部に変数使用時には " "で囲む
// " => \"   タブ=> \t
```

```php:ヒアドキュメント
$text = <<<EOT   // 'EOT':変数不可 　"EOT",EOT:変数可

  // 長めのテキスト（改行や字下げも保持）

EOT;   // 終端記号（改行必須、コメント不可）...文字自体は自由
```

```php:計算
echo 10 + 3 . PHP_EOL; // 13
echo 10 - 3 . PHP_EOL;  // 7
echo 10 * 3 . PHP_EOL; // 30
echo 10 / 3 . PHP_EOL; // 3.333...
echo 10 % 3 . PHP_EOL;  // 1
echo 10 ** 3 . PHP_EOL; // 1000 乗算
echo (2 + 10) * 3 . PHP_EOL; // ()優先
echo 2 +'3' . PHP_EOL; // 5 
//文字列でも数値っぽいものは数値化して計算する

// 自己代入
$price += 100;
$price -= 100;
//　±1
$price++;
$price--;

```
```php:定数
// 大文字で定義、どちらか2パターン
define('NAME','tomo');
const NAME = 'tomo';
```

| データ型| 型 | 例 |
|:-:|:-:|:-:|
|文字列 |string | 'hello', "world"  |
|整数|int |  2, 4, -10 |
|浮動小数点|float| 2.5, -4.2 |
| null     |  null    |   |
|  真偽値 | bool  | true,false  |
| 配列  |array    | [3,6,2]  |
|  オブジェクト | object   | new Object()  |

```php:型確認
var_dump($変数)  // 型(数値or文字数）文字列

// キャスト（型変換）
// 値の前に()で型指定
$a = (float)20;      
$b = (string)2.5; 
var_dump($a);  // float(20)
var_dump($b);  // string(3) "2.5"

```

```php:if文
if (条件①){
  // 条件①がtrueの場合の処理
} else if (条件②) {
  // 条件②がtrueの場合の処理
} else {
  // どれも当てはまらない場合の処理
}      // if 文は末尾 ; 不要

```

```php:比較演算子、真偽値、論理演算子
>= // 以上
<= // 以下
>　// より大きい
<　// より小さい
===　// 等しい
!==　// 異なる

$X = 3 ;
if ( $X ) {  ...      
// 単一文字,数字でも可
// false , ±0, ± 0.0, '0' , ' ' , null , [ ] , はfalse,　以外はtrue
// 条件式や値は真偽値として評価される

&& and  // かつ
|| or   // もしくは
!     // 〜ではない
```

```php:switch文

switch (①：変数など){
  case ❶:
    // ①が❶の場合の処理
    break;   // breakを入れない場合、条件が2つ重なる
  case ❷:
    // ①が❷の場合の処理
    break;
  case ❸:
  case ❹:    // 複数条件時はcaseを重ねる
    // ①が❸または❹の場合の処理
    break;
  default:
　　// ①がどれにもあてはまらない場合の処理
    break;
}
```

```php:for文
// for (定義; 条件 ; 変更){}
for ($i = 1 ; $i <= 3 ; $i++){
   // $iを1と定義して、$iが3以下の条件になるまで処理、処理後$i＋＋
   規定回数 ループ処理
}
```

```php:while文
while (条件①){
  条件が満たされるまで ループ処理
  条件①の変化 // 状態変化を付けないと無限ループ
}

do{
  1回処理を行った上で、条件が満たされるまで ループ処理
  条件①の変化 
} while(条件①);　  // ；　が必要

```
```php:スキップ・中断
for ($i = 1; $i <= 10; $i++) {
  if ($i === 4){
     if ($i % 3 === 0 ){
     continue;   // 処理をスキップ(当てはまる場合はその処理だけ飛ばす）
     break; // 処理を中断(当てはまる場合、その時点で処理を止める）
  }
  echo $i . PHP_EOL;
}
```

```php:関数・引数・return
function 関数名(仮引数 = 'デフォルト値')
{
  // 繰り返し使用したい処理  （引数込）
  return 返したい処理;  // return時点で処理終了、値が戻る。
}

関数名(実引数);  //　呼び出し 
```

```php:スコープ 
$変数A = 1.1; 　//グローバルスコープ 

function sum($a, $b, $c)
{
  global $変数A; 　// global記述で外定義の変数使用できるが非推奨
  $変数A = 1.08;  // ローカルスコープ  ...内部で定義し直す
  return ($a + $b + $c)*$変数A; // 関数の外で定義された変数だと使用不可
}
echo sum(100, 200, 300) + sum(300, 400, 500) . PHP_EOL;　
 // 1944 ローカルスコープ が適用

```

```php:無名関数
// function sum()のように名称定義しない関数

$sum = function ($a, $b, $c) { 
  return $a + $b + $c;
};　　// 関数代入の場合 末尾 ; 必要
echo $sum(100,300,500) . PHP_EOL;  // 900
```

```php:条件演算子
function sum($a, $b, $c) 
{
  $total =  $a + $b + $c;
  // if ($total < 0){
  //   return 0;
  // } else {
  //   return $total;
  // }
  
// こちらに書き換え可
  return $total < 0 ? 0 :$total;
}
echo sum(100,300,500) . PHP_EOL;   // 900
echo sum(-1000,300,500) . PHP_EOL;   // 0
```

```php:型指定
declare(strict_types=1);  // 厳密な型付け設定

// 引数の型付けは値の前に型名をいれる
// : のあとに返り値の型も指定できるがない場合は void
function showPoint(string $name, int $point): void  
{
  echo $name . ': ' . $point . PHP_EOL;
}

// showPoint('tomo',20);
// showPoint('tomo','tomotomo');  // 型指定しない場合でも処理してしまう
//　引数の型指定でエラーにできるが
showPoint('tomo','6');  // 文字列でも数値っぽい場合は処理できる
// 処理させたくない場合はdeclare〜で厳密な型付け設定に。
```

```php:null渡し

declare(strict_types=1);

function getPoint(int $point): ?string    // null　or string　という設定
{
  return $point >= 100 ? 'Good' : null ;
}

echo getPoint(150) . PHP_EOL;　// Good
echo getPoint(40) . PHP_EOL;　// nullでエラーになるので、
// 「?型」　設定でnullも渡せるようにする　引数でも使用可
```

```php:配列・キー
// 同種データをまとめたもの
$scores = [   
  30,   
  60,
  100,　 // 最後も , を入れると管理しやすい
  ];      
$scores[0] = 50;　//　代入で変更可

$scores = [
  'first' => 30,  // 添字ではなくキーで管理可
  'second' => 60,
  'third' => 100,
];
$scores['second']   // 60
```

```php:foreach
// $scores の要素を$scoreに繰り返し代入して処理
foreach ($scores as $score){
  echo $score . PHP_EOL;
}
// key も出力可能
foreach ($scores as $key => $score){
  echo $key . '--' . $score . PHP_EOL;
}
```

```php:要素展開

// 配列内配列
$配列名 = [①,②,[③、④],];
$配列名[0] => ①
$配列名[2][0] => ③

// 配列に別配列の要素を展開する場合 
$配列A = [a,b,c];
$配列B = [①,②,...$配列A, ③]; // [①,②,a,b,c,③]

```

```php:可変長引数
//可変長引数 引数が幾つでも可
// function sum($a, $b, $c) ではなく
function sum(...$numbers) 
{
  // return $a + $b + $c;
  $total = 0;
  forEach ($numbers as $number){
    $total += $number;
  }
  return $total;
}

```

```php:複数返り値
function getNum(...$numbers)
{
  $total = 0;
  foreach ($numbers as $number) {
    $total += $number;
  }
  return [$total, $total / count($numbers)];   // 返り値を配列代入
}

list($sum, $average) = getNum(1,2,3);　// こちらか
[$sum, $average] = getNum(1,2,3);   // こちらのパターンで代入

echo $sum . PHP_EOL;  // 6
echo $average . PHP_EOL;  // 2

```

# 参考

[ドットインストール](https://dotinstall.com/)