ドットインストールのPHP入門を見て分かったこと(箇条書き)

ドットインストールのPHP入門まとめ
#01PHPを使ってみよう
・公式サイトはphp.net
・必要となる知識
「ローカル開発環境の構築[Windows編]」
「UNIXコマンド入門(一般ユーザー編)」
・環境
ローカル開発環境でPHPを動かす
「php_lessons」という名前のファイルを作成して使っていく
「vagrant」ローカル開発環境構築に使われる。

#02はじめてのPHPプログラム
・index.phpファイルを作る。
・HTMLの中に埋め込む。
・```<p>文章<?php echo "hello from PHP"; ?></p>```「```;```」は文章の区切り、「```"”```」表示する文字を表現できる。
・冒頭にPHPプログラムを埋め込む場合もある。

#03ビルドインWebサーバーを使ってみよう
・PHPファイルはブラウザで表示するためにはwebサーバーが必要。ローカル開発環境でもできるが、設定が面倒なのでPHPが用意している簡易的なビルドインサーバーを使ってみる。
・ローカル開発環境のipアドレスを調べる。「```ip a```」
・「```php –s IPaddress:Portnumber```」でURLとURLにつながるファイルを表示してくれる。
・ctrl+Cでサーバーを停止できる。

#04変数とデータ型について理解しよう
・phpの終了タグは以降に出力するものがなければ省略することが推奨される。
・変数：データにつけるラベル、複雑なデータに名前を付けて使いまわすことができる。
「$」```$msg=”Hello from the TOP”```これは、右辺をmsgという左辺に代入するという代入演算子と呼ばれる。
一度代入してしまえば、その後は右辺を$msgで置き換えられる。
・データ型：```文字列型string、数値型integer(整数) float(浮動小数点数)、論理値boolean(true false)、配列、オブジェクト、nullなど```
データ型は定義する必要はなくPHPが自動で定義してくれる。
自動で判断されたデータ型を確認する際は「```var_dump($smg);```」で表示される。
※```var_dump(‘’Hello world);```を実行すると、string(11)”hello world”と表示される。
これは、文字列がstring型で11文字であることを示している。
#05定数を使ってみよう
・定数：値につけるラベルだが、プログラム上で変更されない値につける。
「```define(“MY_EMAIL”,”mailaddressname”);```」
・定数の中には自動で定義される定数がある。
「```var_dump(__LINE__)```」現在の行数「```var_dump(__FILE__)```」現在のファイル「```var_dump(__DIR__)```」現在のディレクトリを表示してくれるので確認できる。

#06数値の演算をしてみよう
・四則演算は「```+、-、*、/```」で行う。
・余り、PHP5.6以降ではべき乗は「```%、**```」で表せる。
・単項演算子「```++```」「```--```」1足す1引く
・代入を伴う演算子
「```$x = 5; $x = $x + 2;```」を「```$x = 5; $x += 2;```」と表せる。

#07文字列を扱ってみよう
・文字列はいくつかの表現方法がある。
・「```””```」特殊文字や変数の展開ができる。
特殊文字には改行(```\n```)、タブ(```\t```)
※```\```はバックスラッシュの置き換え
・「```’’```」特殊文字や変数が使えない。
・変数は「{}」で囲むとわかりやすい。「```{$name}」「${name}```」のどちらでも機能する。
・文字列の連結「```$s = “Hello” . ”World” ; var_dump($s)```」

#08if文で条件分岐をしてみよう
・if文「```$score = 85;
if ($score > 80){
  echo"great!";
}elseif($score > 60){
  echo"good!";
}else{
  echo"so so ...";
}```」
・比較演算子「```>、<、>=、<=、==、===、!=、!===```」
大きい、小さい、以上、以下、値の比較で等しい、値とデータの型が等しい、値だけで比較、型も等しい。
・論理演算子「```and(&&)、or(//)、not(!)```」

#09真偽値について理解しよう
・比較演算子を使わないでも、データの値事態で真偽値を判定することが可能、データの型によって真になる場合と偽になる場合を知っておくべき。
・# falseになる場合は空もしくは”0”の文字列、”0”または”0.0”の数値、falseの論理値、要素の数が0である配列、nullの時である。
・三項演算子
「```$max = ($a > $b) ? $a : $b;```」aがbより大きければ(条件が真であれば)aを大きくなければbをmaxに代入する。

#10switch文で条件分岐をしてみよう
・変数がとりうる値が予めいくつか決まっている時の条件分岐をすっきりかける。
```$signal=”red”;
switch($signal){
case ”yellow”: 
echo “caution!”;
case ”blue”:
case”green”: 	
echo “go!”;
break;
default:
echo “wrong signal”
break;
}
```

#11while文でループ処理をしてみよう
・ループ処理にはwhile文かdo … while文がある。
・while文
```$i = 0;
while ($i < 10){
echo $i;
$i++;
}```
・do … while文
```$i = 0;
do{
echo $i;
$i++
}while($i < 10);```

・違い
前判定か後判定か
例えば上のコードが$i = 100;で始まると、while文では一度もコードが実行されないがdo … while文では一度だけ実行される。

#12for文でループ処理をしてみよう
・whileと同様のループ処理。
・for文
for(ループの始まる際の最初の初期化処理、ループが終わる条件、ループが終わるごとに行う条件){ループさせる処理}
・for文の例
```for($i = 0; $i < 10; $i++){
echo $i;
}```
・break文
ループを抜ける。
```for($i = 0; $i < 10; $i++){
if($i=5){
break;
}
echo $i;
}```
・continue文
それ以降の処理を実行せずに次のループに移る。
```for($i = 0; $i < 10; $i++){
if($i=5){
continue;
}
echo $i;
}```
実行すると、5だけが表示されない。

#13配列を使ってみよう
・配列とはkeyとvalueがペアになったデータ構造のことである。
```$sales = array(“nishioka” => 200, “tanioka” => 300, “yamaoka” => 400);```
・PHP5.4以降では、
上のコードをarrayを使わずに大かっこで簡単に書ける。
```$sales = [“nishioka” => 200, “tanioka” => 300, “yamaoka” => 400];```
・これらのデータを使いたい場合は
```var_dump($sales[“nishioka”]);```
・データを変更したい場合は
```$sales[“nishioka”]=350;```など
・配列のkeyは省略できる。
その場合は、keyは自動で0からの連番になる。
```$colors = [“red”, “blue”, ”pink”];
var_dump($colors[1]);```
を実行すると「blue」と表示される。

#14foreachを使ってみよう
・配列の内容をループ処理で取り出すことができる。
・keyも一緒に取り出すかどうかで書き方が異なる。
```$sales = [“nishioka” => 200, “tanioka” => 300, “yamaoka” => 400];
foreach($sales as $key => $value){
echo “($key) $value ”;
}```
・keyを取り出さない場合
```$colors = [“red”, “blue”, ”pink”];
foreach($colors as $value){
echo “$value”;
}```
・コロン構文
・foreach if while for文で使える。
波かっこ「{}」を「:」が始まり「endforeach」や「endif」に変更する。
・コロン構文の利点はHTMlの内部ですっきり書けること
HTMLのリストを作るときに、
```<?php
$colors = [“red”, “blue”, ”pink”];
foreach($colors as $value)：
echo “$value”;
endforeach;
?>
<ul>
<?php foreach($colors as $value): ?>
<li>
<?php echo “$value”; ?>
</li>
<?php endforeach: ?>
</ul>```

#15関数を使ってみよう
似たような処理をまとめて登録したいと時に使えるのが関数。
・sayHiと呼ばれる関数を作る。
・関数の登録
```function sayHi(){
echo “hi!”
}```
・関数の呼び出し
```sayHi();```
・関数の呼び出し2 (引数)
functionの「()」の中に変数を定義し引数を渡して表示させることができる。
```function sayHi($name){
echo “hi!”
}
sayHi(“Tom”);
sayHi(“Bob”);```
・関数の呼び出し3(初期値の設定)
functionの「()」の中に変数を定義し引数を渡して表示させることができる。
```function sayHi($name = “everyone”){
echo “hi!”
}
sayHi(“Tom”);
sayHi(“Bob”);
sayHi();```
三番目の引数なしで渡したときは初期値が表示される。

・関数の呼び出し4(関数からの返り値)
表示をせずに文字列を返してほしい場合、returnでその時点で関数の処理を終了させつつ呼び出し元に値を返す命令を出すことができる。
```function sayHi($name = “everyone”){
echo “hi!”
return ”hi!” .$name;
}
sayHi(“Tom”);
sayHi(“Bob”);
$s = sayHi();
var_dump($s);```

#16ローカル変数を理解しよう
・関数内で定義した変数はその関数内のみで有効である。
```function sayHi($name){
$lang=”php”;
echo “hi! $name from $lang”
}
sayHi(“Tom”);
var_dump($lang);```
を実行すると
「hi!Tom from phpNULL」と表示され、波かっこ外にあるvar_dump($lang);
が機能していないことがわかる。

・同名の変数があっても関数の外にある場合、関数の外と内でその変数の切り替えが行われる。
```$lang=ruby;
function sayHi($name){
$lang=”php”;
echo “hi! $name from $lang”
}
sayHi(“Tom”);
var_dump($lang);```
を実行すると、「hi! Tom from php(4)”ruby”」という表示がでる。

#17便利な組み込み関数を使ってみよう
・すでに要されている組み込み関数がいくつかある。
・小数点以下を切り上げる関数ceil
・小数点以下を切り下げる関数floor
・四捨五入をするための関数round
・乱数を作成するための命令random
```$x=5.6;
echo ceil($x);
echo floor($x);
echo round($x);
echo random($x);```
・文字数を数えてくれるstrlen
・マルチバイトの日本語の文字数を数えてくれるmb_strlen
・書式を指定して値を表示するprintf
```$s1=”hello”;
$s2=”ねこ”;
$x=5.6;
echo strlen($s1); //5
echo mb_strlen($s1); //2
echo printf(“%s - %s - %.3f”, $s1, $s2, $x,);```
※string型の文章は%s、数値は.3で小数点3桁を表示できる。
・要素の数をカウントするcount
・配列の要素をある区切り文字でもって連結して文字列として返すimplode
```$colors = [“red”,”blue”,”pink”];
echo count($colors);
echo implode(“@”, $colors);```
この場合、「3red@blue@pink」と表示される。 

#18クラスとインスタンスを理解しよう
・複雑なデータ構造を自分で作りたい場合、classやInstanceという仕組みが役立つ。
・ユーザーに関するデータ構造を定義して使いたい場合には、「ユーザークラス(User)」を作ってみる。
クラスの持つ変数をプロパティ、関数をメソッドと呼ぶ。
前のコードの例ではプロパティが$nameでメソッドがsayHi()である。
クラスではデータ構造を定義しただけなので、実際に使うにはユーザーごとにインスタンスを作る必要がある。
クラスをもとに実際にデータを持たせたオブジェクトのことをインスタンスと呼ぶ。
TomやBobそれぞれにインスタンスを作成する「$tomと$bob」。
インスタンスを作る命令はnewであり、「```$bob = new User(“Bob”); $tom = new User(“Tom”);```」と入力する。
こうすることで、TomやBobがプロパティやメソッドを使えるようになる。
「```$Tom->name```」「```$Tom->sayHi()```」で使えるようになる。
クラスには特殊なメソッドがあり、クラスがインスタンス化される時に必ず呼ばれるメソッドがConstructorである。

#19クラスを作ってみよう
・クラスを作るときはクラスキーワードの後に、大文字から始まるクラス名を書く。
```class User/*ユーザークラス*/{
/*プロパティ(名前のデータを格納するボックスの様な所、変数)*/
public $name; 
/*コンストラクター(受け取ったデータをインスタンスに送るための関数)*/
public function __construct($name) {
$this->name = $name;/*インスタンスの*/
}
/*メソッド*/
public function sayHi(){
echo “hi, I am $this->name!”;
}
}
$tom = new User(“Tom”); /*インスタンスの作成*/
$bob = new User(“Bob”); /*インスタンスの作成*/
echo $tom->name; //Tom
$bob->sayHi(); // Jo, I am Bob!```
※constructorはmethodの一種なのでfunctionを使う。「```function __construct(/*渡されるデータ*/){渡されたデータをクラスの中のあるプロパティに入れるためのコード}```」
※「```$this->name```」で「このクラスの中のnameプロパティである」ということになる。
※「```$tom = new User(“Tom”);```」でインスタンス化する。

#20クラスを継承してみよう
```class User{
public $name; 
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!”
}
}
$nishioka = new Adminuser(“Nishioka”);
echo $nishioka->name;
$nishioka->sayHi();
$nishioka->sayHello();```

を実行すると「Nishiokahi, I am Nishoka!hello from admin!」
※AdminUserはUserの子クラスを呼ばれる。
※メソッドやプロパティを独自に追加することができる。
子クラスのほうで親クラスのメソッドとプロパティを変更できる。
これをoverrideと呼ぶ。
```class User{
public $name; 
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!”
}
public function sayHi(){
echo “[admin] hi, I am $this->name!”;
}
}
$nishioka = new Adminuser(“Nishioka”);
echo $nishioka->name;
$nishioka->sayHi();
$tom->sayHi();```
を実行すると「hi, i am Tom![admin] hi, i am Nishioka!」

・親クラスで特定のメソッドのオーバーライドを禁止する方法
```class User{
public $name; 
public function __construct($name) {
$this->name = $name;
}
final Public function sayHi(){
echo “hi, I am $this->name!”;
}
}```
メソッドの前に「final」をつける。

#21アクセス権について理解しよう
・public：どこからでもアクセス可能
・privete：そのクラス内のみアクセス可能
・protected：そのクラス+親子クラス内のみアクセス可能

#22staticキーワードを使ってみよう
・クラスはインスタンス化して使うと説明してきたが、インスタンス化せずに使えるメソッドやプロパティを定義することができる。
・スタティックキーワード
```class User{
public $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();```
※インスタンスを作らないのでインスタンスを作る際に設定される「```$name```」のようなデータが使えない。
※インスタンスなしで「User」にアクセスするためには
「```/*クラス名*/::/*メソッド名*/```」
・スタティックプロパティも設定できる。
・インスタンス化された数を数えるスタティックプロパティをクラスに対して設定する。
```class User{
public $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!”;
}
}
$tom = new User(“Tom”);
$bob = new User(“Bob”);
echo User::$count; //2```

#23抽象クラスを使ってみよう
・抽象クラスは他のクラスに継承されることが前提したクラスで、インスタンス化できない。
・一部のメソッドを抽象メソッドにしてこのクラスを継承したクラスで必ず実装されていることを保証することができる。/
・実装する際には引数の数やアクセス権を同じにしておく必要がある。
```abstract class BaseUser
/*抽象クラス名*/
{
public $name;
abstract public function sayHi();
}
class User extends BaseUser{
public function sayHi(){
echo “hello from User”;
}
}```
#24インターフェースを使ってみよう
```interface sayHi/*インターフェイス名*/{
public function sayHi();
}
interface sayHi{
public function sayHello();
}
class User implement sayHi, sayHello{
public function sayHi(){
}
public function sayHello(){
echo”hello!”;
}
}```
・抽象クラスとの違い：抽象クラスの相手は抽象メソッド以外のメソッドやプロパティの実装ができるのに対し、インターフェースはできない。
抽象クラスは1つしか実装できないのに対してインターフェースは複数実装できる。

#25外部ファイルを読み込んでみよう
・開発の規模が大きくなってくると複数のファイルに分割して管理する場合
```<?php
class User
{
public $name; 
public function __construct($name) {
$this->name = $name;
}
public function sayHi(){
echo “hi, I am $this->name!”;
}
}
$tom = new User(“Tom”);
$bob->sayHi();
?>```
を
```<?php
class User
{
public $name; 
public function __construct($name) {
$this->name = $name;
}
public function sayHi(){
echo “hi, I am $this->name!”;
}
}
?>```
を別のファイルに移す。
```<?php
$tom = new User(“Tom”);
$bob->sayHi();
?>```
が残る。
元のファイルで新しく作ったファイルを読み込む時は、
・「require」：エラーが出たときにfatal errorを発生させてその場で処理を実行する。
・「require_once」：onceがついていればphpが自動でファイルが読み込まれているかチェックしてくれて読み込まれていればそれをスキップする。
・「include」：warningを発生させて処理を実行。
・「include_once」：onceがついていればphpが自動でファイルが読み込まれているかチェックしてくれて読み込まれていればそれをスキップする。
・クラスしか使えないが「autoload」：クラスが未定義だった時に自動的に実行する。
を使う。
・例1：
```<?php
require “newfilename.php”;
$tom = new User(“Tom”);
$bob->sayHi();
?>```
・例2：
```<?php
spl_autoload_register(function($class){
require $class . “.class.php”; 
});
$tom = new User(“Tom”);
$bob->sayHi();
?>```
#26名前空間を使ってみよう
・ファイルを分割していき、他の人が作ったファイルを読み込んだ時にクラス名がバッティングしないように、自分が作ったクラスには名前空間をつけてかぶらないようにする。
読み込むファイルのコードに名前空間を設定する。
```<?php
namespace NishiokaPHP/*かぶらないうような名前*/;
class User
{
public $name; 
public function __construct($name) {
$this->name = $name;
}
public function sayHi(){
echo “hi, I am $this->name!”;
}
}
?>```
また、読込を行うファイルではユーザークラスを使う際の名前空間を指定する。
```<?php
require $class . “.class.php”; 
$tom = new NishiokaPHP\User(“Tom”);
$bob->sayHi();
?>```
・階層的に管理していくと名前空間が長い名前になったりするので別名をつける。
```<?php
require $class . “.class.php”; 
use NishiokaPHP as Ni;
$tom = new Ni\User(“Tom”);
$bob->sayHi();
?>```
もしくは
```<?php
require $class . “.class.php”; 
use NishiokaPHP as Ni;
$tom = new Ni\User(“Tom”);
$bob->sayHi();
?>```

#27例外処理をしてみよう
・何らかの処理をしていて予期しない結果が発生したときに適切に処理していく方法。
```function div($a, $b){
echo $a / $b;
}
div(7,2); //3.5
div(5,0); //ワーニングがでるはず```

このような場合に独自の処理をするならば
```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); //3.5
div(5,0);```
#28フォームからのデータを処理しよう
・HTMLのファイルからデータを受け取ってPHPでどう処理するか
文字数チェックをするものを作ってみる。
```<?php
$username = ‘’;
if($_SERVER[‘REQUEST_METHOD’] === ‘POST’){
$username = $_POST[‘username’];
$err =false;
if(strlen($username)>8){
$err=true;
}
}
?>
<!DOCTYPE html>
<html lang = “ja”>
<head>
<meta charaset=”utf-8”>
<title>Check username</title>
</head>
<body>
<form action =”” method=”POST”>
<input type=”text” name=”username” placeholder=”user name”>
<?php echo htmlcpecialchars($username, ENT_QUOTES, ‘UTF-8’); }?>
<input type=”submit” value=”Check!”>
<?php if ($err){echo “Too long!”;}?>
</form>
</body>
</html>
```
#29Cookieを使ってみよう
・Cookieを使うとアクセスしてきたユーザーのブラウザにデータをセットできる。
```<?php
setcookie(“username”, “nishioka”);
?>```
でセットできる。
・使う時は
```<?php
echo $_COOKIE[‘username’];
?>```
複数のページから共通のデータが使える。
・セットする時に第三引数をとることができそこで有効期限を設定できる。
セットしないとブラウザを閉じるまでに自動で設定されている。
```<?php
setcookie(“username”, “nishioka”, time()+60*60);
?>```
で1時間後に消えるCoockieを設定できる。
・Cookieを削除する方法は有効期限を過去の期限にすればよい。
```<?php
setcookie(“username”, “nishioka”, time()-60*60);
?>```
#30セッションを使ってみよう
Cookieと同じようにアクセスしてきたブラウザに応じてデータを保存できるが、サーバーに保存することがCookieとの違い。
・セット
```<?php
session_start();
$_SESSION[’username’]=”nishioka”;
?>```
・呼び出し
```<?php
session_start();
echo $_SESSION[‘username’];
?>```
・削除
```<?php
session_start();
unset($_SESSION[‘username’]);
?>```