生PHPについて知識を資産化していく① 

# 前提として
+ 自分が勉強してきた知識を保存するために書いています。
+ 本当に初歩的な事から書いていってます。
+ 万が一間違っている可能性もございますので、その時はご指摘頂ければ嬉しいです。
+ 常時更新していく予定です。
+ アウトプット用ですので、MAMPを使用していきます。

#####PHPについての記事はこちらから

 + [生PHPについて知識を資産化していく②](https://qiita.com/shotee/items/a23ae54814fa36289cb2)
 + [生PHPについて知識を資産化していく③](https://qiita.com/shotee/items/2fa14f5ae06b6c4adec2)
 + [生PHPについて知識を資産化していく④](https://qiita.com/shotee/items/345da9bfa086c82c3e33)
 + [生PHPについて知識を資産化していく⑤](https://qiita.com/shotee/items/cf859e6ad4b503600924)



## ブラウザに「test」表示させる
```index.php
<?php

echo 'test';

?>
```

## 現在のPHPのバージョンと設定一覧を表示させる
```index.php
<?php

phpinfo();

?>
```

## 数字と文字
+ 数字は半角で入力する
+ 文字はシングル(またはダブル)クウォーテーションをつける

```index.php
<?php

echo 123; →　数字

echo('こんにちは') //文字
echo("こんにちは") //文字

?>
```

## 変数
「$」マークで書き始める

```index.php
<?php

$test = 123; //「123」という数字が$testに代入される
$tsuishi = 'こんにちは'; //「こんにちは」という文字が$tsuishiに代入される

echo $test; //ブラウザに 123 と表示される
echo $tsuishi; //ブラウザに こんにちは と表示される

?>
```

※同じ変数は後から書いたものが上書きされる

```index.php
<?php

$test = 123;
$test = 456;

echo $test; //ブラウザに 456 と表示される

?>
```



## 型を確認する
var_dump()

```index.php
<?php

$test = 123;
$tsuishi = 'こんにちは';

var_dump($tsuishi); //$tsuishiの型を確認する → string(15)と表示される
var_dump($test); //$testの型を確認する → int(123)と表示される

?>
```

## 定数
変わらない文字、数
同じ定数があっても上書きされない。

```index.php
<?php

const MAX = 10;
const MAX = 20;

echo MAX; //10と表示

?>
```

##配列(１行バージョン)

※プログラミングは0から始まるので、

+ 0の場合1
+ 1の場合2
+ 2の場合3

```index.php
<?php

$array = [1, 2, 3];

echo $array[1]; //2と表示

//中身を全部みたい場合
echo '<pre>'; //改行して表示させる
var_dump($array);
echo '</pre>';

↓

array(3) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  int(3)
}


?>
```

## 配列(2行3列バージョン)

```index.php
<?php

$array_2 = [
  ['赤', '青', '黄'],
  ['緑', '紫', '黒']
];

echo '<pre>';
var_dump($array_2);
echo '</pre>';

↓

array(2) { //[0],[1]の２つの配列がある
  [0]=>
  array(3) {　//[0]の中に配列が3つある
    [0]=>
    string(3) "赤"
    [1]=>
    string(3) "青"
    [2]=>
    string(3) "黄"
  }
  [1]=>
  array(3) {　//[1]の中に配列が3つある
    [0]=>
    string(3) "緑"
    [1]=>
    string(3) "紫"
    [2]=>
    string(3) "黒"
  }
}

// 紫を出したい場合
echo $array_2[1][1]; //[1]の配列の中の[1]の紫を出力する

?>
```

## 連想配列
配列と書き方が違う。
### 配列
数字（順番固定）と値がセット。
$array[1];

### 連想配列
キーと値がセット。
キー => 値
key => value
$array["key"];

```index.php
<?php

$array_member = [
  'name' => '本田',
  'height' => 170,
  'hobby' => 'サッカー'
];

echo $array_member['hobby']; //サッカーと表示

echo '<pre>';
var_dump($array_member);
echo '</pre>';

↓

array(3) {
  ["name"]=>
  string(6) "本田"
  ["height"]=>
  int(170)
  ["hobby"]=>
  string(12) "サッカー"
}

?>
```

※(例)学校に例えて考えてみる
2組それぞれの生徒の特徴を記述する

```index.php
<?php

$array_member_2 = [
  '本田' => [
    'height' => 170,
    'hobby' => 'サッカー'
  ],
  '香川' => [
    'height' => 165,
    'hobby' => 'サッカー'
  ]
];

//香川の身長を出したい時
echo $array_member_2['香川']['height']; //165と表示

?>
```

各組それぞれの生徒の特徴を記述する

```index.php
<?php

$array_member_3 = [
  '2組' => [
    '本田' => [
      'height' => 170,
      'hobby' => 'サッカー'
    ],
    '香川' => [
      'height' => 165,
      'hobby' => 'サッカー'
    ]
  ],
  '3組' => [
    '長友' => [
      'height' => 160,
      'hobby' => 'サッカー'
    ],
    '乾' => [
      'height' => 168,
      'hobby' => 'サッカー'
    ]
  ]
];

// 3組の長友のheightを出したい時
echo $array_member_3['2組']['長友']['height']; //160と表示

?>
```

**このように段階で分けていくことにより、
クラス・組・学年・学校・都道府県などで分けてデータを引っ張ってこれる**

## 演算子(計算や判定)抜粋

```演算子抜粋
四則演算子 (+, -, *, /, %)

比較演算子 (>, >=, +=, ===, !==)

論理演算子 (and, &&, or, ||, xor)

!= nullや、!= emptyはよく使う
== は使わない === を使う

//==　→ 一致
//===　→ 型も一致

++ でインクリメント (1ずつ増える)

```

```index.php
<?php

$test_1 = 7;
$test_2 = 3;

$test_3 = $test_1 + $test_2;
$test_4 = $test_1 - $test_2;
$test_5 = $test_1 * $test_2;
$test_6 = $test_1 / $test_2;
$test_7 = $test_1 % $test_2;

echo $test_3; //4と表示
echo $test_4; //4と表示
echo $test_5; //21と表示
echo $test_6; //2.33333333...と表示
echo $test_7; //1と表示

?>
```

## 条件分岐
プログラムが得意なもの
条件分岐(信号機など)と繰り返し

### if文

```index.php
<?php

if (条件)　{
  条件が真なら実行
}

//例
$height = 90;

if ($height == 90) {
  echo '身長は' . $height . 'cmです';　//身長は90cmです と表示
}

?>
```

### else文

```index.php
<?php

if (条件)　{
  条件が真なら実行
} else {
  条件が偽なら実行
}

//例
$height = 90;

if ($height === 95) {
  echo '身長は' . $height . 'cmです';
} else {
  echo '身長は' . $height . 'cmではありません'; //身長は90cmではありません と表示
}


?>
```

### elseif文

```index.php
<?php

if (条件)　{
  条件が真なら実行
} elseif{
  上記条件が偽で、こちらが真なら実行
} else {
  条件が偽なら実行
}

//例
$signal = 'yellow';

if ($signal === 'red') {
  echo '止まれ';
} elseif ($signal === 'yellow') {
  echo '一旦停止';
} else {
  echo '進め';
}
//一旦停止 と表示

?>
```

## if文の中にif文

```index.php
<?php
//例
$speed = 80;

if ($signal === 'blue') {
  if ($speed >= 80) {
    echo 'スピード違反'; //スピード違反 と表示
  }
}

?>
```

## 〜ではない(!==)
!= →　~ではない
!== → 型が同じかどうかも含め~ではない

//例

```index.php
<?php

$height = 91;

if ($height !== 90) {
  echo '身長は90cmではありません。'; //身長は90cmではありません。 と表示
}

?>
```

### データが入っているかどうか
※empty → データが空かどうか確認する

```index.php
<?php

//例
$test = '';

if (empty($test)) {
  echo '変数は空です'; //変数は空です と表示
}

//例
$test = '1'; //文字

if (!empty($test)) {
  echo '変数は空ではありません'; //変数は空ではありません と表示
}

//例
$test = '1';

if (empty($test)) {
  echo '変数は空です';
} else {
  echo '変数は空ではありません'; //変数は空ではありません と表示
}

※elseを使うとスマートではないので、if (!empty($test))の書き方が良い。

?>
```

### AND(&&) と OR(||)

```index.php
<?php

//例 AND(&&)
$signal_1 = 'red';
$signal_2 = 'blue';

if ($signal_1 === 'red' && $signal_2 === 'blue') {
  echo '赤と青です'; //赤と青です と表示
}

//例 OR(||)
$signal_1 = 'red';
$signal_2 = 'yellow';

if ($signal_1 === 'red' || $signal_2 === 'blue') {
  echo '赤です'; //赤です と表示
}

?>
```

### 三項演算子
条件 ? 真 : 偽

```index.php
<?php

//例
$math = 80;

$comment = $math > 80 ? 'good' : 'not good';

echo $comment; //not good　と表示
?>
```

## foreach
//複数の値
foreach(複数形 as 単数形)

```index.php
<?php
//例
$members = [
  'name' => '本田',
  'height' => 170,
  'hobby' => 'サッカー'
];

//valueのみ表示
foreach($members as $member) {
  echo $member; //本田170サッカー と表示
}

//keyとvalueそれぞれ表示
foreach($members as $key => $value) {
  echo $key . 'は' . $value . 'です';
}
//nameは本田ですheightは170ですhobbyはサッカーです と表示

?>
```

### 多段階の配列を展開

```index.php
<?php
//例
$members_2 = [
  '本田' => [
    'height' => 170,
    'hobby' => 'サッカー'
  ],
  '香川' => [
    'height' => 165,
    'hobby' => 'サッカー'
  ],
];

foreach($members_2 as $member_1) {
  foreach($member_1 as $member => $value) {
    echo $member . 'は' . $value . 'です';
  }
}

//heightは170ですhobbyはサッカーですheightは165ですhobbyはサッカーです と表示

?>
```

## 繰り返し文
for, while

### for文()
繰り返す数が決まっている
//処理の例

```
for($i = 0, $i < 10; $i++) {
  処理
}
```

```index.php
<?php
//例
for($i = 0; $i < 10; $i++) {
  echo $i;
}
//0123456789 と表示

?>
```

```index.php
<?php
//break
//例(5になったら止める)

for($i = 0; $i < 10; $i++) {

  if ($i === 5) {
    break;
  }
  echo $i;
}
//01234 と表示

?>
```

```index.php
<?php
//continue
//例(5をスキップする)

for($i = 0; $i < 10; $i++) {

  if ($i === 5) {
    continue;
  }
  echo $i;
}
//01234 と表示

?>
```

### while文
繰り返す数が決まっていない

```index.php
<?php

$j = 0;
while($j < 5) {
  echo $j;
  $j++;
}
//01234 と表示

?>
```

## switch文

+ if文の方が見やすいので基本はif文を使うようにする
+ caseの後にbreakを入れないとそのまま処理が走ってしまうので入れるようにする
+ どれにも当てはまらない場合は default となる

```index.php
<?php

$data = 1;

switch($data) {
  case 1:
    echo '1です';
    break;
  case 2:
    echo '2です';
    break;
  case 3:
    echo '3です';
    break;
  default:
  echo '1〜3ではありません';
}

//1です と表示

?>
```

## 関数
関数は2種類

+ 組み込み関数 → 準備してある関数
+ ユーザー定義関数 → 自由に作れる関数

組み込み関数に関してはこちら
[関数リファレンス](https://www.php.net/manual/ja/funcref.php)

```
function test(引数) {
  //処理

　　return 戻り値;
}
```

```index.php
<?php
//インプット引数 なし
//アウトプット戻り値 なし

function test() {
  echo 'テスト';
}

test();
//テスト と表示

?>
```

```index.php
<?php
//インプット引数 あり
//アウトプット戻り値 なし

function getComment($string) {
  echo $string;
}

getComment('コメント');
//コメント と表示

?>
```

```index.php
<?php
//インプット引数 なし
//アウトプット戻り値 あり

function getNumberOfComment() {
  return 5;
}

var_dump(getNumberOfComment());
//int(5) と表示

$commentNumber = getNumberOfComment();

echo $commentNumber;
//5 と表示

?>
```

```index.php
<?php
//引数 2つ
//アウトプット戻り値 あり

function sumPrice($int1, $int2) {
  $int3 = $int1 + $int2;
  return $int3;
}

$total = sumPrice(3, 5);

echo $total;
//8 と表示

?>
```

## 文字列関数

```index.php
<?php
//文字列の長さ

$text = 'abc';

echo strlen($text);
//3 と表示

?>
```

```index.php
<?php
//日本語 SJIS, UTF-8 3〜6バイト(文字1文字で3バイト) → strlen

$text = 'あいうえお';

echo strlen($text);
//15 と表示

?>
```

```index.php
<?php
//マルチバイト → 単純に日本語の文字数(mb_strlen)

$text = 'あいうえお';

echo mb_strlen($text);
//5 と表示

?>
```

```index.php
<?php
//文字列の置換 → str_replace()

$str = '文字列を置換します';

echo str_replace('置換', 'ちかん', $str);
//文字列をちかんします と表示

?>
```

```index.php
<?php
//指定文字列で分割 → explode()

$str_2 = '指定文字列で、分割します';

echo '<pre>';
var_dump(explode('、', $str_2)); //「、」で分割する
echo '</pre>';

↓

array(2) {
  [0]=>
  string(18) "指定文字列で"
  [1]=>
  string(15) "分割します"
}

?>
```

```index.php
<?php
//正規表現 → preg_match()
//文字列かどうか, 数字かどうか, 郵便番号, メールアドレスかどうかを確認する

preg_match('/文字列/, $str_3');

?>
```

詳しくはこちらをご確認ください
[正規表現パターンに使用可能な修飾子](https://www.php.net/manual/ja/reference.pcre.pattern.modifiers.php)
[webdesign leaves](https://www.webdesignleaves.com/pr/php/php_basic_03.php)

```index.php
<?php
//指定文字列から文字列を取得する → substr()
//文字化けしないように取得する → mb_substr()

echo substr('abcde', 1);
//bcde と表示

echo mb_substr('あいう', 2);
//う と表示

?>
```

## 配列の関数(array)

```index.php
<?php
//配列に配列を追加する(array_push)

$array = ['りんご', 'みかん'];

array_push($array, 'ぶどう', 'なし');

echo '<pre>';
var_dump($array);
echo '</pre>';

↓

array(4) {
  [0]=>
  string(9) "りんご"
  [1]=>
  string(9) "みかん"
  [2]=>
  string(9) "ぶどう"
  [3]=>
  string(6) "なし"
}
//ぶどうとなしが追加される

?>
```

PHPの配列関数に関してはこちら
[図解でわかるPHP配列関数一覧](http://html2php.starrypages.net/php/array-funcs)


###関数名について

```
キャメルケースかスネークケースで関数名をつける。

//キャメルケース
checkPostalCode() → 最初の英単語の頭文字は小文字、次の英単語から頭文字は大文字で書く

//スネークケース
check_postal_code() → 英単語ごとにアンダーバーで区切る

※基本的にはスッキリしているキャメルケースで書く!!
```

##組み込み関数

```
<?php
//郵便番号のチェック

$postalCode = '123-4567';

function checkPostalCode($str) {
  // ハイフンをなくすために空にする
  $replaced = str_replace('-', '', $str);
  // ハイフンがなくなった後の文字の数を取る
  $length = strlen($replaced);

  var_dump($length);  //int(7) と表示

  if ($length === 7) {
    return true;
  }
  return false;
}

var_dump(checkPostalCode($postalCode));
// bool(true) と表示

?>
```

##変数のスコープ

有効範囲
例：
+ グローバル = 全世界
+ ローカル = それぞれ

```index.php
<?php

$globalValiable = 'グローバル変数です';

function checkScope() {
  $localValiable = 'ローカル変数です';
  echo $localValiable;
  (関数の中で$globalValiableを指定しても使えない)

　//どうしても関数の外にあるグローバル変数を使う場合は、globalと前につける
　global $globalValiable;
  echo $globalValiable; //グローバル変数です と表示

}

echo $globalValiable; //グローバル変数です と表示
echo $localValiable; //表示されない

checkScope(); //ローカル変数です と表示

?>
```

※globalというキーワードを使うことはほとんどない

グローバル変数を使いたい場合は、インプットを引数に書くようにするとスマートに書ける

```index.php
<?php

$globalValiable = 'グローバル変数です';

function checkScope($str) {
  $localValiable = 'ローカル変数です';
  echo $str;
}

echo $globalValiable;
echo $localValiable;

checkScope($globalValiable); //グローバル変数です と表示

?>

```

##ファイルの読み込み

```
require(); require_once(); //エラー

include(); include_once(); //警告
```

```commom.php
<?php

$commonVariable = "共通の変数です";

function commonTest() {
  echo '外部ファイルの関数です';
}
?>
```

```
<?php

require 'common.php';

echo $commonVariable; //共通の変数です と表示

commonTest(); //外部ファイルの関数です と表示

?>
```

##マジック定数

+ ＿＿DIR＿＿ ← 現在のファイルの絶対パスを表示する
+ ＿＿FILE＿＿ ←現在のファイルを表す

```index.php
<?php

__DIR__; //例：/Applications/MAMP/htdocs/***/　の中にファイルがあると判断できる

__FILE__; //例：/Applications/MAMP/htdocs/***/index.php　のファイルだと判断できる

?>
```


#####PHPについての記事はこちらから

 + [生PHPについて知識を資産化していく②](https://qiita.com/shotee/items/a23ae54814fa36289cb2)
 + [生PHPについて知識を資産化していく③](https://qiita.com/shotee/items/2fa14f5ae06b6c4adec2)
 + [生PHPについて知識を資産化していく④](https://qiita.com/shotee/items/345da9bfa086c82c3e33)
 + [生PHPについて知識を資産化していく⑤](https://qiita.com/shotee/items/cf859e6ad4b503600924)