ねっとぱんだ-プログラミング勉強ブログ-

Webデザイン、プログラミングの勉強ブログ。

【php】アカウント登録、ログイン機能をクラス化してみる

アカウント登録、ログイン機能をクラス化

引き続き、チームラボさんの研修をやりました。

https://team-lab.github.io/skillup/2/4.htmll

研修の仕様なのか僕がヘボいからか、このまま写経すると渡された引数が使われてなかったりエラーになったりする記述だったので直しながらの制作でした。
同じ機能を別の書き方をすることにより前より理解が深まったと思います。

<?php
class Auth{
  //接続に必要な情報を定数化
  const HOST_NAME = "localhost";
  const USER_NAME = "root";
  const PASSWORD = "";
  const DATABASE_NAME = "login";
  
  private $mysql = null;
//オブジェクト作成時と共に呼び出される処理
  function __construct(){
    $this->mysqli = new mysqli(
      self::HOST_NAME,
      self::USER_NAME,
      self::PASSWORD,
      self::DATABASE_NAME
    );
    session_start();
  }
    
  //ユーザー登録ができたかどうか
  public function register($username,$password){
      //受け取ったパスワードをハッシュ化
      $password = password_hash($password,PASSWORD_DEFAULT);
      $stmt = $this->mysqli->prepare("INSERT INTO users VALUES(?,?)");
      $stmt->bind_param('ss',$username,$password);
      //実行後、結果が成功したかどうか返される
      return $stmt->execute();
  }
    
  public function login($username,$password){
    //クラス内のメソッドよびだしは$this->をつける
    $stmt = $this->mysqli->prepare(
      "SELECT password FROM users WHERE username = ?");
    $stmt->bind_param('s',$username);
    $stmt->execute();
    $stmt->store_result();
    if($stmt->num_rows == 1){
      $stmt->bind_result($hash);
      while ($stmt->fetch()){
        if(password_verify($_POST['password'],$hash)){
          $_SESSION['username'] = $_POST['username'];
          return true;
        }
      }
    }
    return false;
  }
  
  public function getUser(){
    if(isset($_SESSION['username'])){
      return $_SESSION['username'];
      return null;
    }
  }
  
  //ログアウトする
  public function logout(){
    $_SESSION = array();
    session_destroy();
  }
  }

ついでなので研修課題もやります↓。

[課題]オブジェクト指向について調べよう

オブジェクト指向のメリットやデメリットについて調べてみましょう。また、「継承」とは何かについて調べてみましょう。」

オブジェクト指向のメリット

  • プログラムをグループ化して分けると言う、プログラム作成の概念
  • プログラマムの簡潔さは、現れる
  • 以前に作ったグループを再利用することも可能
  • ある部品(クラス)と別の部品を組み合わせて、新たな機能も作れる
  • 「ある箇所を仕様変更したら、他の箇所に悪影響してしまった」と言うことが、比較的に少ない
  • 各プログラム部品の役割がきちんとわかるので、デバッグの面でも良い
  • ゲームでの利用でかなり便利

参考:https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1149572636

前にunityでC#に触れたときに記述した内容はオブジェクト指向だったんですね。

オブジェクト指向のデメリット

  • 組み込みではオブジェクト指向の採用があまり進んでいない
  • 必要なリソースが大きい。オブジェクト指向によるプログラムは、言語構造上メモリを贅沢に使う
  • 関数の数も多くなるため、オーバーヘッドによるロスが大きくなる。
  • オブジェクト指向のプログラムよりコードの量が増える
  • 従来のパラダイムより設計が難解
  • 設計で妥協するとリソースだけ浪費してオブジェクト指向のメリットが全く活かされないという事態を招く
  • オブジェクトそれぞれが独立して状態を持つためステップを追った解析が難しい
  • ライブラリ型の構造が不適
    低レイヤのプログラムは基本的に非オブジェクト指向言語。低レイヤ層との親和性が損なわれる

参考:http://goyoki.hatenablog.com/entry/20080114/1200325011