PHP

PHPメモ(超初心者用)

ドットインストールを参考にphpの書き方まとめ
個人的メモです

1.書き方

<?php

echo "hogehoge"; PHPを書くときは?php で囲む

?>

2.変数は 

$msg = "hello world!"; の様に $を使う

3.var_dump

var_dump($msg); 
var_dumpを使うとその型string等と値を表示してくれる

結果:「endo@dotinstall.comstring(19)
 19文字でstring型だよと表示される

4.定数:変更されない値につけるラベル

define("MY_EMAIL", "endo@dotinstall.com");

使い方
define("定数名", "値") として使う

注意事項
必ずdefineを宣言してあげる
定数は大文字
定数は変更を加えられないので上記のMY_EMAILに
 MY_EMAIL = "hogehoge"; と代入しようとするとエラーになる
 
 
よくある定数
 var_dump(__LINE__); //現在の行数を表示
 var_dump(__FILE__); //ファイル名を表示
 var_dump(__DIR__); //ディレクトリ名を表示
 

5.数値型の演算

$x = 10 % 3; //余り1
$y = 30.2 / 4; //7.55

var_dump($x);
var_dump($y);

結果int(1) float(7.55)

$x : integer型で値が1 
$y : float型で値が7.55と表示される


//単数演算子
$z = 5;
$z++;  
$z--;  //5(int)
var_dump($z)



//代入を伴う演算子
$x = 5;
$x = $x * 2;

var_dump($x)

上下の結果は同じものになる

$x = 5;
$x *= 2;

var_dump($x)

結果:10

6.文字列

//""特殊文字(\n, \t),変数の展開ができる
//''展開できない

$name = "endo";
$s1 = "hello $name!\nhello again!";
$s2 = 'hello $name!\nhello again!';

var_dump($s1);
var_dump($s2);

結果""の部分は改行され''は改行されずそのまま描画されている

string(24) "hello endo!
hello again!"
string(26) "hello $name!\nhello again!"


ちなみにRubyと同じ様に変数を{}(Rubyは"#{}")で囲むことも可能個人的に変数展開はこの書き方の方が描きやすい
$name = "endo";
$s1 = "hello {$name}!\nhello again!";
$s2 = 'hello {$name}!\nhello again!';

var_dump($s1);
var_dump($s2);


文字の連結
//連結
$s = "hello" . "world";
var_dump($s);

結果string(10) "helloworld"

helloworldと連結して表示された(Rubyではを使う)

7.if文 条件分岐

内容$scoreが80より大きい場合great!
           60より大きい場合good!
           それ以外so so...
           
//if文 条件分岐
// 比較演算子 > < >= <= == === != !==
// 論理演算子 and &&, or ||, !

コード
$score = 85;

if ($score > 80) {
  echo "great!";
} elseif ($score > 60) {
  echo "good!";
} else {
  echo "so so...";
}

結果great!

Rubyとelsifの書き方がちょっと違う(´-`).oO

8.真偽値

// 真偽値

/*
falseになる場合のパターン:
  ・文字列:文字列が空か、"0"
  ・数値 : 0, 0.0
  ・論理値:false
  ・配列:要素の数が0
  ・null
*/


コード:
$x = 5;
if ($x) {
  echo "great!";
}

結果:great!
意味: $xがtrueの場合echoしてね

9.三項演算子

// 三項演算子

コード: $max = ($a > $b) ? $a : $b;

意味($a > $b)の条件が真(true)の場合$aを$maxに代入(false)の場合$bを$maxに代入

// if文で書き換えるとこんな感じ
if ($a > $b) {
  $max = $a;
} else {
  $max = $b;
}

三項演算子を使えばかなり省略できる

10.switch文 条件分岐

// awitch文 条件分岐

$signal = "red";

switch ($signal) {
  case "red":
    echo "stop!";
    break;
    case "blue":
      echo "go!";
      break;
      case "yellow":
        echo "caution!";
        break;
      default: //←どれにも当てはまらない場合
      echo "wrong signal!";
}

結果今回はredなのでstopが表示される

11.while文 ループ処理

// ループ処理
// wihle
// do...while


させたい処理$iが10より少ない場合ループ表示させるループごとに+1させる

while文パターン
$i = 0;
 while ($i < 10) {
   echo $i;
   $i++;
 }


do...while文パターン
do {
  echo $i;
  $i++;
} while ($i < 10);

(do...whileはループが後処理になる)

解説
echo $i;で0を表示$i+++する10になった時点でループ解除させる
$i++が無いと無限ループになってしまう

結果0123456789

双方同じループ処理になるのでやりたい事に応じて選択する

12.for文 ループ処理

// ループ処理
// for
// break: ループを抜ける
// continue: それ以降の処理を実行せずに次のループに移る

$iが10より小さい場合+1し続けるという命令

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

結果0123456789 


[上記の処理にbreakを加える]

$iが5の時に処理を止める

$i = 0;
for ($i = 0; $i < 10; $i++) {
  if ($i === 5){
    break;
  }
  echo $i;
}

結果01234


ちなみに上記のbreakをcontinue;に変更すると5だけの処理が実行されずに次のループに移る

$i = 0;
for ($i = 0; $i < 10; $i++) {
  if ($i === 5){
    continue;
  }
  echo $i;
}

結果012346789
5の処理が飛ばされてループ処理されている

13.配列

// 配列
// key value


配列の例
$sales = [
  "endo" => 200,
  "tky" => 800,
  "dotinstall" => 600,
];

var_dump($sales);

実行結果array(3) { ["endo"]=> int(200) ["tky"]=> int(800) ["dotinstall"]=> int(600) }

ちゃんと配列(array)に入っていることを確認できた.


var_dumpの値を変えることで配列に入っている値を取り出すことが可能
上のコードを参考にkeyを与えると値が返ってくる

var_dump($sales["endo"])
実行結果int(200)

var_dump($sales["tky"])
実行結果int(800)

var_dump($sales["dotinstall"])
実行結果int(600)

配列の値を変えることも可能 :
 var_dump($sales["endo"]); #ここまでは実行結果200
 $sales["endo"] = 900; #値を900に上書き
 var_dump($sales["endo"]);

これで実行結果がint(900)に変わっている


配列キーの省略パターン

$colors = ["red", "blue", "pink"]
var_dump($colors[2]);

結果"blue"
省略パターンの方がすっきりしてるのでこっちで書く方がよさそう

14.配列 foreach


foreach文の使い方

 foreach ($配列名 as $key => $value){
    echo "($key) $value";
 }

 又は配列のパターンによっては(コロン構文endforeachを使った場合)
  foreach ($配列名 as $value):
    echo "$value";
 endforeach;

============================================================================================

$sales = [
    "endo" => 200,
    "tky" => 800,
    "dotinstall" => 600,
];

 foreach ($sales as $key => $value){
    echo "($key) $value";
 }

 結果(endo) 200 (tky) 800 (dotinstall) 600
 配列に代入したものがすべて取得可能

 ============================================================================================

 コロン構文(endforeachを使ったパターン)
 コロン構文の利点HTMLへ書くときにすっきりかける

 $colors = ["red", "blue", "pink"]

 foreach($colors as $value) :
    echo "$value";
 endforeach;
 #これでとりあえず配列の中身を取得完了

 HTMLと組み合わせてリスト形式に書いていく(下記コード)

 <?php 
 $colors = ["red", "blue", "pink"]
  ?>
  <ul>
   <?php foreach($colors as $value) : ?>
     <li><php? echo "$value"; ?></li>
   <?php endforeach; ?>
  </ul>

  結果:
・red
・blue
・pink
  このようにリスト形式で表示される

15.関数(function)

関数を使う場合はfunctionというキーワードを使う

===============================================================================================
#まず関数を定義する
function 関数名() {
  処理内容...
}

関数名(); #関数を呼び出し

という風に使う

===============================================================================================

単純にHiと返してくる関数を作ってみる

function say() {
    echo "Hi!";
}

say();

結果Hi!が返ってくる

関数に引数を与えることも可能!!
先ほどのコードを使って引数を与えてみる

#引数を呼び出す変数を与える
function say($name) {
    echo "Hi!".$name;
}

#ここで引数を与える
say("Bob");
say("Tom");

結果HiTom HiBob
引数を与えて呼び出す事に成功!!

初期値を与える
ちなみに関数に初期値を与えることも可能


#初期値の値を代入
function say($name = "endo") {
    echo "Hi!".$name;
}

say("Bob");
say("Tom");
say(); #ここで関数を入れていない物には初期値の値が入る

結果Hi!Tom Hi!Bob Hi!endo
のように初期値のendoが呼び出される

返り値return)】
返り値を返してくる事も可能です。(returnというキーワードを使う
return : returnを使うとその時点で関数の処理を終了させ呼び出し元に値を返してくれる命令

今回は先ほどのコードを使って単純に文字列を呼び出す

function say($name = "endo") {
    return "Hi!".$name;
}

say("Bob");
say("Tom");
say();

$s = say();
var_dump($s);

結果Hi!endo
returnを使っているので今回は初期値の値だけが返ってきている

16.ローカル変数

関数内で定義した変数は関数内でしか利用できない

例えば下記の様なコードを書いてみた


function sayHi($name) {
  $lang = "php";
  echo "hi! $name from $lang";
}

sayHi("Tom");


結果hi! Tom from php
関数内で完結しているため問題なく出力されている

これにvar_dump($lang);を追加してみる


function sayHi($name) {
  $lang = "php";
  echo "hi! $name from $lang";
}

sayHi("Tom");
var_dump($lang);


結果hi! Tom from phpNULL
関数の外で変数を呼び出そうとするとnullとなり出力されない


関数の中で定義した変数は関数の中でしか扱えないので関数外で扱う場合は外で定義する必要がある


$lang = "ruby";

function sayHi($name) {
  $lang = "php";
  echo "hi! $name from $lang";
}

sayHi("Tom");
var_dump($lang);



結果hi! Tom from phpstring(4) "ruby"
こうすることで$langが呼び出せた

17.組み込み関数

// 関数
// 組み込み関数


//数値
$x = 5.6;
// echo ceil($x); //ceil: 小数点以下を繰り上げる 6
// echo floor($x); //floor: 小数点以下を切り捨てる 5
// echo round($x); //round: 四捨五入 6
// echo rand(1, 10); //rand(~から, ~までの数字);をランダムに表示


//文字
$s1 = "hello";
$s2 = "ねこ";
echo strlen($s1); //文字数を取得 5
echo mb_strlen($s2); //日本語の文字数を取得 2

// 書式を指定して値を表示する
printf("%s - %s - %.3f", $s1, $s2, $x); //hello - ねこ - 5.600
//  %sはstring型を示している ($s1と$s2はstring型なので、%sで示す)
//  %fはfloat型を示している ($xはfloat型なので、%fで示す)
//  floatの場合は%,3fとすると小数点3桁まで表示される

//配列
$colors = ["red", "blue", "pink"];
echo count($colors); //count: 配列の数 3
echo implode("@", $colors); //implode: 連結 red@blue@pink

18.クラス

クラスの仕組み

クラスが持つ変数をプロパティ
クラスが持つ関数をメソッド

Userクラスを例としたら
    $nameプロパティ
    sayHiメソッド など

クラスを元にデータを持たせた物をインスタンス
    $tom
    $bob など

スクリーンショット 2018-05-02 14.06.52.png

19.クラスの作成

クラス内にプロパティ、コンストラクター、メソッドなどを定義

今回はUserクラスにnameプロパティを使う
UserClassに$nameプロパティを定義する


Class User {
    public $name;
}


コンストラクターは名前が決まっているため
public function __construct($引数){

}

という型になる

あとクラスの中のプロパティやメソッドにアクセスする為には
this->アクセスしたいプロパティ = $プロパティを使う

コードにするとこんな感じ

Class User {
    public $name;

    public function __construct($name){
        this->name = $name;
    }

}



<?php

// User クラス

Class User {
  // property(クラスが持つ変数)
  public $name;

  // constructor(メソッドの一種)書き方は関数と同じ
  public function __construct($name){
    $this->name = $name;
  }

  //method(クラスが持つ関数)
  public function sayHi() {
    echo "hi, i am $this->name!";
  }

}


// インスタンス
$tom = new User("Tom");
$bob = new User("Bob");

echo $tom->name; //Tom
$bob->sayHi(); //hi, i am Bob!


結果:Tom hi, i am Bob!

20.クラスの継承

class継承:あるクラス(親クラス)を元に、新しいクラス(子クラス)を作る為の仕組み

「class 子クラス extends 親クラス」 という公式を使う

例えば、Userクラスを親クラスとしてAdminUserという子クラスを作りたい場合

//extendsを使う
class AdminUser extends User 

classの継承をすることでAdminUserクラスでUserクラスのメソッドや、プロパティを扱うことができる

class User {
  // property
  public $name;

  // constructor
  public function __construct($name){
    $this->name = $name;
  }

  //method
  public function sayHi() {
    echo " hi, i am $this->name!";
  }
}

//  クラスの継承
class AdminUser extends User {
  public function sayHello() {
    echo "hello from Admin!";
  }
}


// インスタンス
$tom = new User("Tom");
$steve = new AdminUser("Steve");
echo $steve->name;  //Steveが呼び出される
$steve->sayHi();  //hi, i am Steve!が呼び出される
$steve->sayHello(); //hello from Admin!が呼び出される


結果:Steve hi, i am Steve!hello from Admin!
AdminUserクラスでUserクラスのメソッド、プロパティを使うことが可能であることを確認できた

21.アクセス権

・private: そのクラス内からのみアクセス可能
・protected: そのクラス+親子クラス内からのみアクセス可能
・public: どこからでもアクセス可

Userクラスの$nameをprivateにすることで、インスタンスから呼び出せないことを確認する.
下記コードで検証

// アクセス権
// - private: そのクラス内からのみアクセス可能
// - protected: そのクラス+親子クラス内からのみアクセス可能
// - public: どこからでもアクセス可能

class User {
  // public $name;
  private $name; //privateにすることでクラス内では使えるがインスタンスから呼び出すことができないくなる
  public function __construct($name) {
    $this->name = $name;
  }
  public function sayHi() {
    echo "hi, i am $this->name!";
  }
}

class AdminUser extends User {
  public function sayHello() {
    echo "hello from Admin";
  }
} 

$tom = new User("Tom");
echo $tom->name; //nameをprivateにしているのでインスタンスからはアクセスできない様になっている
$steve = new AdminUser("Steve");

結果:ブラウザが白紙で表示されないので成功

継承したクラスからもアクセスできないのか検証

<?php

// アクセス権
// - private: そのクラス内からのみアクセス可能
// - protected: そのクラス+親子クラス内からのみアクセス可能
// - public: どこからでもアクセス可能
class User {
  // public $name;
  private $name; //privateにすることでクラス内では使えるがインスタンスから呼び出すことができないくなる
  public function __construct($name) {
    $this->name = $name;
  }
  public function sayHi() {
    echo "hi, i am $this->name!";
  }
}

class AdminUser extends User {
  public function sayHello() {
    echo "hello from $this->name";
  }
}

$tom = new User("Tom");
// echo $tom->name; //nameをprivateにしているのでインスタンスからはアクセスできない様になっている
$steve = new AdminUser("Steve");
$steve->sayHello();


結果hello from
hello from Steveと表示されていないのでnameにアクセスできていないことを確認

publicにしたくないけどprivateほどアクセス権を付与したく無い場合はpritectedを使えば良い

22.staticキーワード

staticキーワード(インスタンス化しなくても使える メソッドやプロパティ)

public static function getMessage() {
    処理内容;
  }
  staticと書いて、あとはいつも通りメソッドを定義すればおk
class名::メソッド名();

例:User::getMessage();

staticキーワードを使って単純に文字を呼び出してみる

// static(インスタンス化しなくても使える メソッドやプロパティ)

class User {
  // public $name;
  // private $name; //privateにすることでクラス内では使えるがインスタンスから呼び出すことができないくなる
  protected $name;
  public function __construct($name) {
    $this->name = $name;
  }
  public function sayHi() {
    echo "hi, i am $this->name!";
  }
  public static function getMessage() { ←注目
    echo "hello from User class!";
  }
}

User::getMessage(); ←注目

結果:hello from User class!

インスタンス化されたプロパティを数えるstaticプロパティを作成

// static(インスタンス化しなくても使える メソッドやプロパティ)

class User {
  // public $name;
  // private $name; //privateにすることでクラス内では使えるがインスタンスから呼び出すことができないくなる
  protected $name;
  public static $count = 0;
  public function __construct($name) {
    $this->name = $name;
    self::$count++;
  }
  public function sayHi() {
    echo "hi, i am $this->name!";
  }
  public static function getMessage() {
    echo "hello from User class!";
  }
}

// User::getMessage();

$tom = new User("Tom");
$bob = new User("Bob");

echo User::$count; //2

結果:2が表示される

23.抽象クラス

// 抽象クラス他のクラスで継承してもらうことを前提としたクラス
// abstract class


abstract class BaseUser {
  public $name;
  abstract public function sayHi();
}

// クラス継承
class User extends BaseUser {
  public function sayHi() {
    echo "hello from User";
  }
}


24.インターフェース

// インターフェース

//使い方: interface インターフェース名
interface sayHi {
  public function sayHi();
}


interface sayHi {
  public function sayHello();
}

class User implements sayHi, sayHello {
  public function sayHi() {
    echo "hi!";
  }
  public function sayHello() {
    echo "hi! hello";
  }
}

25.外部ファイルの読み込み

requireを使う(その他にもこれらが使える)
・require: エラーが出た場合に fatal errorを発生させてその場で処理を停止させる
・require_once

・include: エラーが出た場合に warningを発生させて処理を続行
・include_once

User.class.phpというファイルを作成

User.class.php
<?php

class User {
  public $name;
  public function __construct($name) {
    $this->name = $name;
  }
  public function sayHi() {
    echo "hi, i am $this->name!";
  }
}

index.phpから読み込む

index.php
<?php


require "User.class.php";

$bob = new User("Bob");
$bob->sayHi();


 ?>

これでrequire(読み込み)できた

26.名前空間

namespaceを使う

index.php
<?php



// 名前空間

 require "User.class.php";

 use Dotinstall\Lib as Lib;

$bob = new Lib\User("Bob");
$bob->sayHi();


 ?>

User.class.php
<?php

namespace Dotinstall\Lib;

class User {
  public $name;
  public function __construct($name) {
    $this->name = $name;
  }
  public function sayHi() {
    echo "hi, i am $this->name!";
  }
}

結果hi, i am Bob!

27.例外処理

<?php

//例外処理

// function div($a, $b) {
//   echo $a / $b; #$aを$bで割った結果
// }

function div($a, $b) {
  try {
    if ($b === 0){
    throw new Exception("cannot divide by 0!");
  }
  echo $a / $b;
} catch (Exception $e) {
  echo $e->getMessage();
}
}
//インスタンス
div(7, 2);
div(5, 0);

結果:3.5cannot divide by 0!

27.フォームからデータ処理

<?php

$username = '';
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
  $username = $_POST['username'];
  $err = false;
  if (strlen($username) > 8) {
    $err = true;
  }
}
 ?>

<!DOCTYPE html>
<html lang="ja" dir="ltr">
  <head>
    <meta charset="utf-8">
    <title></title>
  </head>
  <body>
    <form action="" method="post">
      <input type="text" name="username" placeholder="user name" value="<?php echo htmlspecialchars($username, ENT_QUOTES, 'UTF-8'); ?>">
      <input type="submit" value="check!">
      <?php if ($err) {echo "Too long!"; } ?>
    </form>
  </body>
</html>

こういうフォームに8文字以上入力するとToo longと表示される

スクリーンショット 2018-05-02 21.56.46.png

28.cookie

cookie : アクセスしてきたユーザーのブラウザにデータをセットできる

setcookieを使うとデータをkeyとvalueで設定することができる
今回はusernameというkeyにendoというvalueを保存してみる

cookie設定
#usernameというkyeにendoという値を保存する
setcookie("username", "endo");

この状態でブラウザからphpを起動するとcookieが保存されている.
この状態で一回実行すると先ほどの情報が保存されているので$_COOKIE['key']を呼び出すことで先ほど保存した情報を呼び出せる.

echo $_COOKIE['username'];

結果:endoが出力されている

また、setcookieに第3引数を与える事も可能で、今回は有効期限を設定してみる(有効期限を設定しない場合はブラウザを閉じるまで)

time()+60*60を使ってみる(1時間有効)

setcookie("username", "endo", time()+60*60);
これで有効期限を設定可能

セッション

cookieとは違い、サーバー側にデータを保存できる
使い方は、基本的にcookieと同じ

// session
// cookieとは違い、サーバー側にデータを保存できる

// sessionを使う
 session_start();

$_SESSION['username'] = "endo";

echo $_SESSION['username'];