PHPメモ(超初心者用)

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

##1.書き方

```php
<?php

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

?>
```

##2.変数は　

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

##3.var_dump

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

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

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

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

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

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

##5.数値型の演算

```php
$x = 10 % 3; //余り１
$y = 30.2 / 4; //7.55

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

結果：int(1) float(7.55)

$x : integer型で値が１　
$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)

結果：１０
```

##6.文字列

```php
//""特殊文字(\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文 条件分岐

```php
内容：$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
  ・配列：要素の数が０
  ・null
*/


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

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

```
##9.三項演算子

```php
//　三項演算子

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

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

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

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

```

##10.switch文　条件分岐

```php
// 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文　ループ処理

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


させたい処理：$iが10より少ない場合ループ表示させる（ループごとに＋１させる）

【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文　ループ処理

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

$iが10より小さい場合＋１し続けるという命令：

$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.配列

```php
// 配列
// 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

```php


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)

```php
関数を使う場合は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.ローカル変数

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

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


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.組み込み関数

```php
// 関数
// 組み込み関数


//数値
$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とすると小数点３桁まで表示される

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

```

##18.クラス

```php

クラスの仕組み

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

Userクラスを例としたら
	$nameプロパティ
	sayHiメソッド　など
	
クラスを元にデータを持たせた物をインスタンス
	・$tom
	・$bob など

```

![スクリーンショット 2018-05-02 14.06.52.png](https://qiita-image-store.s3.amazonaws.com/0/174952/cf460a50-ba5f-aa34-646e-0bcc2449a0cf.png "スクリーンショット 2018-05-02 14.06.52.png")

##19.クラスの作成

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

```php

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


Class User {
	public $name;
}


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

}

という型になる

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

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

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

}



```


```phpコード
<?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継承した場合のコード

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

<?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と書いて、あとはいつも通りメソッドを定義すればおｋ
```

```呼び出し方
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

結果：２が表示される

```

##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](https://qiita-image-store.s3.amazonaws.com/0/174952/b8064a17-be34-1102-6d0e-12aab4227570.png "スクリーンショット 2018-05-02 21.56.46.png")


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

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

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

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


```cookieが保存されているか確認
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'];

```