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

#前提として

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

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

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


##COOKIEとSESSION

```
①COOKIE(クッキー)
ブラウザごとに情報が保存される

・パスワード保存はNG
・近年GDPRなどで利用が制限されつつある

②SESSION(セッション)
サーバー側で情報を管理している
```

[GDPR|個人情報保護委員会](https://www.ppc.go.jp/enforcement/infoprovision/laws/GDPR/)

###Google ChromeのCOOKIEの場所

①Google Chromeを開き、右上のタブから「設定」をクリック

![chrome設定](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556828/aef19666-68bc-ef5c-596d-1f995d6e0422.png)

②「プライバシーとセキュリティ」 → 「COOKIEと他のサイトデータ」を開く

![cookieとデータ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556828/00335507-1d5b-0d20-31ef-ffddf38beebd.png)

③「すベてのCookieとサイトデータを表示」をクリックする

![すべてのcookieとサイトデータ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556828/86ad42d5-29d6-35a9-c6be-3e572ba80499.png)

④残っているCOOKIE情報が出てくる

![残っているcookie](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556828/0fd32faa-da06-0412-36ac-ffe40639376e.png)

⑤試しに「localhost」と検索すると、テストしていた内容が表示される

![localhost内のcookie](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556828/f6ae3e59-7bb5-5b51-f8d3-6e70e3287efc.png)


##COOKIEとSESSIONの動きが分かる簡単なコードを作成してみる

```sessiontest_1.php
<?php

session_start(); //sessionを含める時には冒頭に必ず書く

?>

<!DOCTYPE html>
<html>

  <head>
    <!-- Required meta tags -->
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

    <!-- Bootstrap CSS -->
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css" integrity="sha384-9aIt2nRpC12Uk9gS9baDl411NQApFmC26EwAOH8WgZl5MYYxFfc+NcPb1dKGj7Sk" crossorigin="anonymous">

    <title>Hello, world!</title>
  </head>

  <body>
  
    <?php

      if (!isset($_SESSION['visited'])) { //設定されていなかったら
        echo '最初の訪問です';

        $_SESSION['visited'] = 1; //訪問時に visitedを1 を受け取る
        $_SESSION['date'] = date('c'); //受け取る日付
      } else { //設定されていたら

        $visited = $_SESSION['visited'];
        $visited++; //visitedの値を 1つ 増やす
        $_SESSION['visited'] = $visited; //増やした値を visited に入れる

        echo $_SESSION['visited'] . '回目の訪問です<br>';

        if (isset($_SESSION['date'])) {//その時に date があったら日付を出す
          echo '前回訪問は' . $_SESSION['date'] . 'です';
          $_SESSION['date'] = date('c'); //現在の日付を 'date'に入れる
        }
      }

    ?>
  
  </body>

</html>
```

①最初の訪問時

![最初の訪問](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556828/6b6d90ee-93c6-8010-95e5-2e046d46e2ad.png)

②2回目の訪問

![2回目の訪問](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556828/80389f54-d7bf-e85f-d21f-9d6ed6306151.png)

③3回目の訪問

![3回目の訪問](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556828/a38951ae-1ea2-07de-45e3-dbf6db1cbd73.png)


####var_dumpで見てみる

```
4回目の訪問です
前回訪問は2021-04-04T07:28:10+00:00です
array(2) {
  ["visited"]=>
  int(4)
  ["date"]=>
  string(25) "2021-04-04T07:33:05+00:00"
}
array(1) {
  ["PHPSESSID"]=>
  string(26) "ここにCOOKIEの値が入っています"
}
```

ブラウザでデータを確認する

![データの確認](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556828/0cd7250e-0952-3d17-cb0c-f3d0c9383f28.png)


##SESSIONを破棄するファイルを作成

```sessiontest_2.php
<?php

session_start();

?>


<!DOCTYPE html>
<html>

  <head>
    <!-- Required meta tags -->
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

    <!-- Bootstrap CSS -->
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css" integrity="sha384-9aIt2nRpC12Uk9gS9baDl411NQApFmC26EwAOH8WgZl5MYYxFfc+NcPb1dKGj7Sk" crossorigin="anonymous">

    <title>Hello, world!</title>
  </head>

  <body>

    <?php

      echo 'セッションを破棄しました';

      // 空の配列を入れることで、セッション情報を空で上書きする
      $_SESSION = [];

      // クッキーにもセッションIDが残っているので削除する
      if (isset($_COOKIE['PHPSESSID'])) {
        // PHPSESSIDに空の情報を入れつつ、過去の日付を入れて削除する
        setcookie('PHPSESSID', '', time() - 1800, '/');
      }

      // セッションを破棄する
      session_destroy();

      echo 'セッション';
      echo '<pre>';
      var_dump($_SESSION);
      echo '</pre>';

      echo 'クッキー';
      echo '<pre>';
      var_dump($_COOKIE);
      echo '</pre>';

    ?>

// ブラウザを読み込むと、作成したセッション情報が破棄される

  
  </body>

</html>

```

php.net:[セッション処理](https://www.php.net/manual/ja/book.session.php)
php.net:[setcookie()](https://www.php.net/manual/ja/function.setcookie.php)
[ログイン機能の簡単実装サンプル（PHP／MySQL）](https://tadworks.jp/archives/1147)

##いろいろな関数

###引数にデフォルト値を設定可能

```function/defaultValue.php
<?php

ini_set("display_errors", 1);
error_reporting(E_ALL);

// = をつけると初期値になる
function defaultValue($string = null) //引数を設定しないとエラーになる
{
  echo $string . 'です';
}

// 引数なし
defaultValue(); //です と表示
echo '<br>';

// 引数あり
defaultValue('テスト'); //テストです と表示

?>
```

###タイプヒンティング(型を明示できる)

```function/type_hinting.php
<?php

  // declare(strict_types=1); // 強い型指定 より固く宣言しないと動かない

  ini_set("display_errors", 1);
  error_reporting(E_ALL);

  echo 'タイプヒンティングテスト' . '<br>';
  /**
   * @param $string
   */
  // 型の指定なし
  function noTypeHint($string)
  {
    var_dump($string);
  }


  noTypeHint(['テスト']); // 引数string予定に 配列→ エラーではない

　↓↓
　//エラーではない
　//タイプヒンティングテスト
　//array(1) { [0]=> string(9) "テスト" }

  echo '<br>';

  // タイプヒンティング (引数に型を指定。 型が違うとエラー)
  // typeTest(string(型), $string(引数))
  function typeTest(string $string) // 引数stringの他に、array,callable, bool, float, int, object, クラス名, インターフェース名
  {
    var_dump($string);
  }

  typeTest(['配列文字']);  // 引数にstringと指定しているのに配列→ こちらはエラー

　↓↓
  // エラーになる
　// Fatal error: Uncaught TypeError: Argument 1 passed to typeTest() must be of the type string,〜

?>
```

php.net：[型宣言](https://www.php.net/manual/ja/language.types.declarations.php)
php.net：[declare](https://www.php.net/manual/ja/control-structures.declare.php)

※PHPは動的型付であり、関数(型, 引数)だと弱い可能性があるので、「declare」などは大人数で作成するときに使われる可能性がある。

+ [コンパイラとインタプリタとは？現役エンジニアが分かりやすく解説]
(https://blog.codecamp.jp/compiler-interpreter-commentary)
+ [動的型付けと静的型付け](https://qiita.com/toryuneko/items/c023031b61886cae2a99)


###可変変数

```function/valiableLengthArgs.php
<?php
// 可変引数(関数の引数に ドット「.」を3つ付けてから変数を書く)
// 複数の変数をまとめて指定することができる
function combine(string ...$name): string // 戻り値の型宣言
{
  $combinedName = '';
  for($i = 0; $i < count($name); $i++) {
    $combinedName .= $name[$i];
    if($i != count($name) - 1) {
      $combinedName .= '・';
    }
  }
  return $combinedName;
}

$lName = '名前';
$fName = '苗字';
$name1 = combine($fName, $lName);

echo '結合結果: ' . $name1 ;
echo '<br>';

$variableLength = combine('テスト1', 'テスト2', 'テスト3');
echo $variableLength;

↓↓

// 結合結果: 苗字・名前
// テスト1・テスト2・テスト3  と表示され、複数の変数を処理してくれている

?>
```

php.net：[新機能・戻り値の方宣言](https://www.php.net/manual/ja/migration70.new-features.php)

###array_map

引数に関数(コールバック関数)を入れることができる

```function/arrayMap.php
<?php

$parameters = [' 空白あり ', ' 配列 ', ' 空白あり '];

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

// array_map(引数に関数) 配列の値それぞれに関数を適用する
$trimedParameters = array_map('trim', $parameters); //trim:空白を削除する関数

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

↓↓

array(3) {
  [0]=>
  string(14) " 空白あり "
  [1]=>
  string(8) " 配列 "
  [2]=>
  string(14) " 空白あり "
}
array(3) {
  [0]=>
  string(12) "空白なし"
  [1]=>
  string(6) "配列"
  [2]=>
  string(12) "空白なし"
}

?>
```

###コールバック関数

引数に関数を入れる

```function/callbacklphp
<?php

function combineSpace(string $firstName, string $lastName): string
{
  return $lastName . ' ' . $firstName;
}

$nameParam = ['名前', '苗字'];

// コールバック関数(引数に関数を入れる)
function useCombine(array $name, callable $func)
{
  $concatName = $func(...$name);
  print($func.'関数での結合結果: ' . $concatName . '<br>');
}

useCombine($nameParam, 'combineSpace');

?>
```

php.net:[コールバック](https://www.php.net/manual/ja/language.types.callable.php)


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

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