PHP基礎

<?php
// シングルクォーテーションまたはダブルクォーテーションが必要
// function(パラメータ); という構文となる
// print 文字列を出力する
// print(string $arg) :int
// 終了タグ(?)は必要ない(省略できる)
print('PHPで出力しています');

// echo(string $arg1 [, string $...]) : void
// voidは何もない(値を返さない)
// echoはパラメータを複数とることができる
// echoは関数ではないため( )を省略することができる
echo '/ echoで出力しています', '/ 2つめの文章です', '/ 3つめの文章です';

// エスケープシーケンス
echo 'I\'am Japanese';
echo "I am \"Japanese\"";

// 改行
// シングルクォーテーションで囲うとそのまま出力される
// エスケープシーケンスを使うときはダブルクォーテーション
echo "\n改行を\n入れて出力します\n";

// ヒアドキュメント構文(<<<)
// 文字列を区切る方法
echo <<< EOT
あああああ
いいいいいい
ううううううううう
ええええええええええええええ
EOT;

echo "\n □Nowdoc";
// Nowdocはヒアドキュメントと似ているが、シングルクォートで囲んだ文字列として扱われる
echo <<< 'EOT'
あああああ
いいいいいい
ううううううううう
ええええええええええええええ
EOT;

算術演算子

<?php
echo 1+2;
echo "\n";
echo 10*3;
echo "\n";
echo 10/3;
echo "\n";

// 乗除算
echo 12%3;
echo "\n";

// 累乗
echo 2*3;
echo "\n";

変数

<?php
$price = 150+80;
$price = 10;
echo $price;
echo "\n";
echo $price*1.1;

$x;
$number_123;
$_123;
// $123; // ×数字から始まる
// $nuber-123; // ×ハイフン
// $_SERVER = 10; // ×予約語

$price = 100;
// 文字列連結 .
echo '50 + 50 は、' . $price . 'です';

$number = 10;
echo "{$number}th anniversary"; // 10th anniversary

定数

<?php
// 定数は慣習として大文字で定義する
const TAX = 10;

// 非推奨
// define(TAX, 10);

echo "消費税は、", TAX, "%です";

関数

<?php
$sum = 5000 + 150;
// number_format 数字を千位毎にグループ化してフォーマットする
// number_format ( float $number [, int $decimals = 0 ]) : string
// パラメータの中の[]は省略可能という意味
// []を省略した場合は0となる
$sum = number_format($sum);
echo $sum, '円です';
<?php
echo '足される数 >';
// STDIN ユーザのキーボードの入力を受け付ける
// fgets ファイルオブストリームから文字列を取得
// trimで改行を取り除く
$number = trim(fgets(STDIN));

echo '足す数 >';
$number2 = trim(fgets(STDIN));

echo $number . ' + ' . $number2 . ' = ' . $number + $number2;

制御構造

if構文

<?php
echo '数字を入力してください';
$number = trim(fgets(STDIN));

// 10よりも大きいかを判断する
if ($number > 10) {
  echo '10よりも大きいです';
} else {
  echo '10以下です';
}

if ($number > 10):
  echo '10よりも大きいです';
else:
  echo '10以下です';
endif;

elseif

if ($number > 10) {
  echo '10よりも大きいです';
} elseif ($number == 10) {
  echo '10です';
} else {
  echo '10以下です';
}
<?php
$number = 10;

// is_numeric 変数が数字または数値形式の文字列であるかを調べる
// 数値または数値形式の文字列である場合にTRUE、それ以外の場合にFALSEを返す
// $numeric = is_numeric($number);

if (is_numeric($numeric)) { // trueを省略
  echo '数字です';
} else {
  echo '数字ではありません';
}

echo '西暦を入力してください';
$year = trim(fgets(STDIN));

if (is_numeric($year) && $year <= date('Y')) {
  // echo '数字が入力されました';
  if ($year >= 2018) {
    echo '令和です';
  } elseif ($year >= 1988) {
    echo '平成です';
  } elseif ($year >= 1925) {
    echo '昭和です';
  } elseif ($year >= 1911) {
    echo '大正です';
  } elseif ($year >= 1867) {
    echo '明治です';
  } else {
    echo '明治よりも前です';
  }
} else {
  echo '今年よりも前の数字を入力してください';
}

$sum = 10 + 5;
echo $sum;

// 変数の再代入
// $sum = $sum + 20;
$sum += 20;
$sum -= 20;
$sum *= 20;
$sum /= 20;

// インクリメント・デクリメント
// $sum += 1;
$sum++; // インクリメント
$sum--; // デクリメント
echo $sum;

データ型と型キャスト

<?php
$number1 = 10; // int型
$number2 = '10'; // string型

// === $number が $numberに等しく、同じ型である場合にTRUE
// (int)でint型に型キャスト
if ($number1 === (int)$number2) {
  echo '同じです';
}

switch構文

<?php
echo '色を選んでください(1.黒, 2.しろ, 3.赤)';
$color = (int)trim(fgets(STDIN));

// if ($color === 1) {
//   echo '黒が選ばれました';
// } elseif ($color === 2) {
//   echo 'しろが選ばれました';
// } elseif ($color === 3) {
//   echo '赤が選ばれました';
// }

// switch構文
switch ($color) {
  case 1:
    echo '黒が選ばれました';
    break;
  case 2:
    echo 'しろが選ばれました';
    break;
  case 3:
    echo '赤が選ばべれました';
    break;
}

配列

<?php
// $black = '黒';
// $white = 'しろ';
// $red = '赤';

// $color[0] = '黒';
// $color[1] = 'しろ';
// $color[2] = '赤';

// 配列
$color = ['黒', 'しろ', '赤'];
// $color = array('黒', 'しろ', '赤'); // PHP5以前の書き方

$number = 10;

$myfavorite = 2;
echo $color[$myfavorite];

多次元配列

<?php
// $book[0][0] = 'デザイン入門';
// $book[0][1] = 'デザインの基礎';

// $book[1][0] = 'PHP入門';
// $book[1][1] = '高度なPHP開発';
// $book[1][2] = 'Laravel入門';

// $book[2][0] = 'JavaScript入門';

$book = [
  ['デザイン入門', 'デザインの基礎'],
  ['PHP入門', '高度なPHP開発']
];

// echo $book[0][1];


// print_r 指定した変数に関する情報をわかりやすく出力する
print_r($book);

連想配列

<?php
// $pref['hokkaidou'] = '北海道';
// $pref['aomori'] = '青森県';
// $pref['iwate'] = '岩手県';

// 連想配列はindexとなるキーを設定し、関連する値を代入する
// $pref = [
//   'hokkaido' => '北海道',
//   'aomori' => '青森県',
//   'iwate' => '岩手県'
// ];

// 連想配列の中に配列を入れる
$pref['hokkaido'] = [
  '赤平市',
  '旭川市',
  '芦別市'
];
$pref['aomori'] = [
  '青森市',
  '鰺ヶ沢町'
];

echo $pref['aomori'][1];

配列 ファンクション

<?php
$color = ['黒', 'しろ', '赤'];

// count 変数に含まれる全ての要素、あるいはオブジェクトに含まれる何かの数を数える
// count ( Countable|array $value [, int $mode = COUNT_NORMAL ] ) : int
// 返り値 valueに含まれる要素を返す
// $max = count($color); // 3
// echo $color($max-1); // 要素は3のため

// 一つ以上の要素を配列の最初に加える
// array_unshift($color, '緑', '黄'); // 0] => 緑 [1] => 黄 [2] => 黒 [3] => しろ [4] => 赤
// array_push($color, '緑', '黄'); //[0] => 黒 [1] => しろ [2] => 赤 [3] => 緑 [4] => 黄

// 配列の先頭から要素を一つ取り出して消す
$mycolor = array_shift($color); // [0] => しろ [1] => 赤
echo $mycolor;

$mycolor = array_shift($color); // [0] => 赤
echo $mycolor;

// array_pop 配列の最後の要素を取り出し消す
$color = ['黒', 'しろ', '赤'];
$mycolor = array_pop($color); // [0] => 黒 [1] しろ
echo $mycolor;

$mycolor = array_pop($color); // [0] => 黒
echo $mycolor;

print_r($color);

$color = ['黒', 'しろ', '赤'];
$color_string = implode(',', $color);
print($color_string); // 黒,しろ,赤

$color_string = implode(' - ', $color);
print($color_string); // 黒 - しろ - 赤

$newarray = explode(',', $color_string);
print($color_string);

for構文

<?php
$color = ['黒', '白', '赤'];

for ($i=0; $i<count($color); $i++) {
  echo $color[$i], "\n";
}

foreach

<?php
$pref = [
  'hokkaido' => '北海道',
  'aomori' => '青森県',
  'iwate' => '岩手県'
];

// 連想配列の値を取り出す(配列でも取得できる)
foreach ($pref as $pref_name) {
  echo ' ・ ', $pref_name, "\n";
}

// 連想配列の値とキーを取り出す
foreach ($pref as $pref_key => $pref_name) {
  echo ' ・ ', $pref_key, ':', $pref_name, "\n";
}

while構文

<?php
$q1 = 5;
$q2 = 10;

echo $q1, '+', $q2, 'は? >';
$answer = (int)trim(fgets(STDIN));

while ($answer !== $q1+$q2) {
  echo 'はずれ。もう一回 >';
  $answer = (int)trim(fgets(STDIN));
}
echo 'あたり!';

do while

<?php
// rand 乱数を生成する
// rand ( int $min, int $max ) : int
// $dice = rand(1, 6);

// while ($dice !== 1) {
//   echo $dice, "\n";
//   $dice = rand(1, 6);
// }
// echo $dice;

do {
  $dice = rand(1, 6);
  echo $dice, "\n";
} while ($dice !== 1);

関数

<?php
// $pref = [
//   'hokkaido' => '北海道',
//   'aomori' => '青森県',
//   'iwate' => '岩手県'
// ];

// foreach ($pref as $pref_code => $pref_name) {
//   echo '・', $pref_code, ':', $pref_name, "\n";
// }

// $color = [
//   'red' => '赤',
//   'blue' => '青',
//   'black' => '黒'
// ];

// // 上記と同じことをしている
// foreach ($color as $color_code => $color_name) {
//   echo '・', $color_code, ':', $color_name, "\n";
// }


// ⬇︎⬇︎ 関数を使うと...

// 連想配列を受け取って、リストにして出力する
function make_list($list) {
  foreach ($list as $key => $value) {
    echo '・', $key, ':', $value, "\n";
  }
}

$pref = [
  'hokkaido' => '北海道',
  'aomori' => '青森県',
  'iwate' => '岩手県'
];

make_list($pref);

$color = [
  'red' => '赤',
  'blue' => '青',
  'black' => '黒'
];

make_list($color);

返り値

<?php
// // number_format numberをフォーマットした結果を返す
// $price = number_format(1000);

// echo $price;

function sum($num1, $num2) {
  $answer = $num1 + $num2;

  // return 後の処理は行われない
  return $answer;
}

$item_sum = sum(167, 269);
echo $item_sum;

可変パラメータ

<?php
// // 合計を計算する
// function sum($num1, $num2, $num3) {
//   $answer = $num1 + $num2 + $num3;
//   return $answer;
// }

// $item_sum = sum(10, 20, 30);
// echo $item_sum;

// ⬇︎⬇︎ さらに出力する値を増やしたい場合(可変パラメータの後にパラメータを追加することはできない、パラメータは最後に追加すると使用できる)
function sum(...$numbers) {
  $answer = 0;
  foreach ($numbers as $num) {
    $answer += $num;
  }
  return $answer;
}

$item_sum = sum(10, 20, 30, 40, 50, 60, 70, 80, 90, 100);
echo $item_sum;

可変パラメータのデフォルト引数

<?php
// リストを作る
function make_list($list, $head = '・') {
  foreach($list as $key => $val) {
    echo $head, $key, ':', $val, "\n";
  }
}

$pref = [
  'hokakid' => '北海道',
  'aomori' => '青森県',
  'iwate' => '岩手県'
];

make_list($pref);
// ・hokakid:北海道
// ・aomori:青森県
// ・iwate:岩手県
make_list($pref, '→');
// →hokakid:北海道
// →aomori:青森県
// →iwate:岩手県

リファレンス(参照)渡し

<?php
// $color = ['黒', '赤', '白'];
// リファレンス(参照)渡し
// array_shift($color);
// print_r($color);
// 黒がなくなる
// Array
// (
//     [0] => 赤
//     [1] => 白
// )

// $price = 10000;
// // 値渡し
// // number_formatファンクションの返り値を受け取った変数($new_price)
// $new_price = number_format($price);
// echo $price;
// echo "\n";
// echo $new_price;

// 配列の先頭に文字を繋げる
function add_head(&$target){
  for ($i=0; $i<count($target); $i++) {
    $target[$i] = '●' . $target[$i];
  }
}

$color = ['黒', '赤', '白'];
print_r($color);
// Array
// (
//     [0] => 黒
//     [1] => 赤
//     [2] => 白
// )
add_head($color);
print_r($color);
// Array
// (
//     [0] => ●黒
//     [1] => ●赤
//     [2] => ●白
// )

無名関数(クロージャー)

<?php
// function sum(int $a, int $b): int {
//   return $a + $b;
// }

// 数字を整形して表示する
function echo_price($callback) {
  echo number_format($callback(1000, 500)), '円';
}

// クロージャー・無名関数
// $get_sum = function ($a, $b) {
//   return $a + $b;
// };

$get_sum = fn($a, $b) => $a + $b;

// $sum = $get_sum(10, 15);
// echo_price($get_sum);
echo_price(function($a, $b){
  return $a + $b;
});

オブジェクト指向

<?php
class Item {
  // プロパティ
  public string $name; // 商品名
  public int $price; // 価格

  // メソッドの定義
  public function getPrice(string $end = '') {
    return number_format($this->price) . $end;
  }
}

// Itemクラスからphp_basicインスタンスの生成
$php_basic = new Item();
$php_basic->name = "PHP入門";
$php_basic->price = 15000000;

echo $php_basic->name, '/', $php_basic->getPrice('円');

$js_basic = new Item();
$js_basic->name = 'JS入門';
$js_basic->price = 2300;

コンストラクター

<?php
class Item {
  // プロパティ
  public string $name; // 商品名
  public int $price; // 価格

  // コンストラクター
  public function __construct(string $name, int $price = 0) {
    $this->name = $name;
    $this->price = $price;
  }

  // メソッドの定義
  public function getPrice(string $end = '') {
    return number_format($this->price) . $end;
  }
}

// デフォルト引数が設定されているため第二引数をしてしなくても実行可能
$php_basic = new Item('PHP入門');
echo $php_basic->name, '/', $php_basic->getPrice('円');

$js_basic = new Item('JS入門', 2300);

継承

<?php
class Item {
  // プロパティ
  public string $name; // 商品名
  private int $price; // 価格
  // public int $page; // ページ数

  // コンストラクター
  public function __construct(string $name, int $price = 0) {
    $this->name = $name;
    $this->price = $price;
  }

  // 価格を設定する
  public function setPrice(int $price) {
    if ($price < 0) {
      return false;
    }
    $this->price = $price;
    return true;
  }

  // 価格を取得する
  public function getPrice(string $end = '') {
    return number_format($this->price) . $end;
  }
}

// Itemクラスを継承
class Book extends Item {
  public int $page; // 書籍のページ数
}

$php_basic = new Book('PHP入門', 2300);
$php_basic->page = 100;
$php_basic->setPrice(1500);

echo $php_basic->name, '(', $php_basic->page, 'ページ/', $php_basic->getPrice('円');

$js_basic = new Item('JS入門', 2300);

メソッドのオーバーライド

<?php
class Item {
  // protected 親クラスと継承したクラスで参照できるプロパティ
  protected int $uint; // 個数(アクセス修飾子をprivateにすると継承クラスでは使用できない)

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

  public function getUint(): string {
    return $this->uint . '個';
  }
}

class Book extends Item {
  // オーバーライド(親クラスで定義されたメソッドを上書きする)
  public function getUint(): string {
    return $this->uint . '冊';
  }
}

$eraser = new Item(10);
echo $eraser->getUint(), "\n"; // 10個

$book = new Book(5);
echo $book->getUint(); // 5冊

親クラスのメソッド呼び出し parent::

<?php
class Item {
  // protected 親クラスと継承したクラスで参照できるプロパティ
  protected int $unit; // 個数(アクセス修飾子をprivateにすると継承クラスでは使用できない)

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

  public function getUnit(): string {
    return $this->unit . '個';
  }
}

class Book extends Item {
  private int $page; // ページ数
  public function __construct(int $unit, int $page) {
    // parent:: 自分の親クラス
    parent::__construct($unit);
    $this->page = $page;
  }
  // オーバーライド(親クラスで定義されたメソッドを上書きする)
  public function getUnit(): string {
    return $this->unit . '冊';
  }
}

$eraser = new Item(10);
echo $eraser->getUnit(), "\n";

$book = new Book(5, 120);
echo $book->getUnit();

インターフェイス

<?php
// 今回であればgetPriceメソッドを必ず使用しなければならない
interface ItemInterface {
  public function getPrice(): int;
}

// ItemInterfaceを実装したBookクラス
class Book implements ItemInterface {
  private int $price;
  public function getPrice(): int {
    return $this->price;
  }
}

// ItemInterfaceを実装したPencilクラス
class Pencil implements ItemInterface {
  private int $price;
  public function getPrice(): int {
    return $this->price;
  }
}

抽象クラス

インターフェイスと同様、約束事を定義できるが
通常のクラスと同じようにプロパティやメソッドを定義できる

<?php
// 抽象クラス
abstract class Item {
  private $price;

  public function getPrice() {
    return $this->price;
  }

  // 抽象メソッド
  abstract public function getUnit();
}

class Book extends Item {
  public function getUnit() {
    return '冊';
  }
}

class Pen extends Item {
  public function getUnit() {
    return '本';
  }
}

$book = new Book();
$book->getPrice();

トレイト

再利用可能なもの

<?php
trait Tax {
  // 消費税を返す
  public function getTax(): int {
    return 10;
  }
}

// 外国の消費税を扱う
trait ForeignTax {
  public function getTax(): int {
    return 20;
  }
}

class Item {
  // TaxとForeginTax2つのトレイトを使用(同じメソッド名の場合)
  use Tax, ForeignTax {
    Tax::getTax insteadof ForeignTax;
    ForeignTax::getTax as getForeginTax;
  }
  private int $price;
}

class Service {
  use Tax;
  private int $service_price;
}

$item = new Item;
echo $item->getTax(), "\n";
echo $item->getForeginTax(), "\n";

$service = new Service;
echo $service->getTax(), "\n";

名前空間

<?php
require_once 'app/Shop/Book.php';
require_once 'app/Review/Book.php';

// path\to\クラス名;
use app\Shop\Book;
use app\Review\Book as BookReview;

$book = new Book();
echo $book->getPrice(), "\n";

$book_review = new BookReview();
echo $book_review->getPoint(), "\n";

静的プロパティ・静的メソッド

<?php
class Item {
  // 静的プロパティ
  public static int $tax = 10; // 消費税

  // 静的メソッド
  public static function getTax(): int {
    // 静的メソッドから静的プロパティを呼び出す際はselfを使用する
    return self::$tax;
  }

  // // 静的メソッド内では$thisは使用できない
  // public static function getTax(): int {
  //   return 15;
  // }
}

// $item = new Item();
// echo $item->getTax();

// echo Item::getTax();

echo Item::$tax;
Item::$tax = 8;

$item02 = new Item();
echo $item02->getTax();

インスタンスの複製(clone)

<?php
class Item {
  public string $name;
}

$item01 = new Item();
$item01->name = 'PHP入門';

// 参照渡し
$item02 = $item01;

// 値渡し
$item02 = clone($item01);

$item01->name = 'JS入門';
echo $item02->name;