Open38

PHP勉強メモ

ピン留めされたアイテム
Yuma ItoYuma Ito

概要

PHPを初めて学ぶときに行ったときのメモ。

学習した内容

  • ProgateのPHP入門(無料でできる範囲): 基礎文法のみ。
  • PHP Tutorial
  • PaizaのスキルチェックのB問題
Yuma ItoYuma Ito

PHPの基礎文法まとめ

主にJavaScriptと異なる部分だけメモ。

以下のようにPHPを記述する部分はタグで囲む。

<?php  ?>
Yuma ItoYuma Ito

文字列の連結

ドット.で文字列同士を連結する。

$lesson = 'PHP';
echo $lesson.'入門'; // 結果:PHP入門

(プロパティとかメソッドの呼び出しではないので注意。)

文字列演算子.=

$a = "Hello ";
$a .= "World!"; // Hello World!

文字列の変数展開

ダブルクオートで囲む&{}で囲むと変数が展開される。(*シングルクォートではそのまま文字列として出力される)

$name = '太郎';
echo "こんにちは、{$name}さん"; // 結果:こんにちは、太郎さん
echo 'こんにちは、{$name}さん';  // 結果:こんにちは、{$name}さん

{}がなくても出力される。

参考:JavaScriptでの変数展開
const name = '太郎';
console.log(`こんにちは、${name}さん`);

改行を出力

ダブルクオート""で囲むこと

echo "\n";
Yuma ItoYuma Ito

配列

配列の初期化・要素の取得

$array = ["あ", "い", "う"];
echo $array[0]; // あ

配列の長さを取得count()

$array = ["あ", "い", "う"];
echo count($array); // 3
参考:JavaScriptの場合
const array = ['あ', 'い', 'う'];
console.log(array.length);
Yuma ItoYuma Ito

連想配列

array(
    key  => value,
    key2 => value2,
    key3 => value3,
    ...
)

で定義する。
例:

 $scores = array(
      "math" => 70,
      "english" => 90,
      "japanese" => 80
 );

echo $scores["math"]; // 70
Yuma ItoYuma Ito

foreach文

配列の要素すべてに対して処理を行う。
as $key => $valueで各要素を変数に代入する。$key =>の部分は省略可能。

 $scores = array(
      "数学" => 70,
      "英語" => 90,
      "国語" => 80
 );

foreach($scores as $key => $value){
  echo "{$key}{$value}点です。<br>";
}
// 結果:
// 数学は70点です。
// 英語は90点です。
// 国語は80点です。
参考:JavaScriptでは
const scores = {
  '数学': 70,
  '英語': 90,
  '国語': 80
};

// for-inを使う方法
for(const key in scores){
  console.log(`${key}${scores[key]}点です。`);
}

// Object.entries()を使う方法
Object.entries(scores).forEach(([key, value])=>{
  console.log(`${key}${value}点です`);
})

foreachを使って、配列から新しい配列を作る例

$base_array = [1,2,3];
$double_array = [];
foreach ($base_array as $num) {
    $double_array[] = $num * 2;
}

echo print_r($double_array, true);
/*
Array
(
    [0] => 2
    [1] => 4
    [2] => 6
)
*/
Yuma ItoYuma Ito

組み込み関数

https://www.w3schools.com/php/php_ref_string.asp

文字列の長さを取得する strlen()

echo strlen('おはよう'); // 4

文字列の置換をするstr_replace

str_replace(find,replace,string,count)
順番に注意

echo str_replace("world", "Dolly", "Hello, world!"); // 結果:Hello, Dolly!

配列の要素数を取得する count()

$array = array('東京', '大阪', '京都');
echo count($array); // 3

整数の疑似乱数を生成する rand

rand(int $min, int $max): int

// 10から15までの乱数を出力したい
echo rand(10, 15);

※生成する値は暗号学的に安全ではないので注意。
https://www.php.net/manual/ja/function.rand.php

Yuma ItoYuma Ito

変数のスコープ

PHPには以下の3種類のスコープがある

  • local: 関数の中で宣言された変数のスコープ。関数内部からのみアクセス可能。
  • global: 関数の外で宣言された変数のスコープ。関数の外からでもアクセス可能。
  • static: 関数が実行された後でも削除されない変数のスコープ。
$x = 5; // global scope
 
function myTest() {
  $x = 1; // local scope
  echo $x; // 結果: 1
  echo "<br>";
} 
myTest();

echo $x; // 結果: 5
function myTest() {
  static $x = 0;
  echo $x;
  $x++;
}

myTest(); // 0
echo "<br>";
myTest(); // 1
echo "<br>";
myTest(); // 2
Yuma ItoYuma Ito

定数

define関数で定義する。

define(name, value, case-insensitive)
  • name: 変数名
  • value: 値
  • case-insensitive(boolean): 変数名の大文字小文字を無視するか(デフォルト: false)

PHP7からは定数の配列を定義できる。

define("cars", [
  "Alfa Romeo",
  "BMW",
  "Toyota"
]);

cars[0] = "Honda"; // エラーになる
参考:TypeScriptでは

(JavaScriptでは書き換え可能)

const cars = ['Alfa Romeo', 'BMW', 'Toyota'] as const;
Yuma ItoYuma Ito

3項演算子(Ternary Operator)

$x = expr1 ? expr2 : expr3

Null合体演算子 (Null coalescing Operator)

PHP7から導入。

$x = expr1 ?? expr2
Yuma ItoYuma Ito

関数

以下のように宣言する。

function functionName($args) {
  code to be executed;
}

PHP7からは引数の型を宣言できるようになった。

function addNumbers(int $a, int $b) {
  return $a + $b;
}

strict宣言をすると、型が合わない場合にFatal Errorとなる。

declare(strict_types=1); // strict requirement

function addNumbers(int $a, int $b) {
  return $a + $b;
}
echo addNumbers(5, "5 days");
// since strict is enabled and "5 days" is not an integer, an error will be thrown

strictではない場合、引数には型チェックなく渡される。

引数のデフォルト値を設定できる。

function setHeight(int $minheight = 50) {
  echo "The height is : $minheight <br>";
}

返り値の型を宣言することができる。

declare(strict_types=1); // strict requirement

function addNumbers(float $a, float $b) : float { // 返り値の型はfloat
  return $a + $b;
}
echo addNumbers(1.2, 5.2);
TypeScriptでは
function addNumbers(a: number, b: number): number {
  return a + b;
}
Yuma ItoYuma Ito

match式

PHP8から導入。

$return_value = match (制約式) {
    単一の条件式 => 返却式,
    条件式1, 条件式2 => 返却式,
};

// 例
$result = match ($x) {
  0 => "0です",
  1 => "1です",
  default => "その他です"
};

switch文と似ているが、いくつか異なる点がある。

  • 厳密比較をする(switch文は緩い比較)
  • 文ではなく式なので、値を返却する
  • switch文のようにbreakがないと次の分岐に進む、ということはない。
  • すべてのパターンを網羅する必要がある(制約式がどの分岐でも処理できなかった場合、 UnhandledMatchErrorがスローされます。)
Yuma ItoYuma Ito

アロー関数

PHP7.4から導入。

fn (argument_list) => expr

無名関数と異なり、親のスコープの変数を利用することができる。

$y = 1;
 
$fn1 = fn($x) => $x + $y;
// $y を値渡しするのと同じ
$fn2 = function ($x) use ($y) {
    return $x + $y;
};
Yuma ItoYuma Ito

PHPでのクラスとか

OOPで必要なクラスなどについてまとめる。

Yuma ItoYuma Ito

クラスの宣言とプロパティ

クラスの宣言はJavaScriptと同じ。
プロパティへのアクセスは->を用いる。

class Menu{
  public $name;
}

$curry = new Menu();
$curry->name = 'CURRY';
echo $curry->name; // 'CURRY'

※プロパティを参照するときに$は不要

Yuma ItoYuma Ito

コンストラクタ

コンストラクタは__construct()関数に定義する。

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

$curry = new Menu("Curry");
echo $curry->name;

$this->プロパティ名でクラス内部のプロパティにアクセスできる

参考:JavaScriptでは
class Menu{
  constructor(name){
    this.name = name;
  }
}
const curry = new Menu("curry");
console.log(curry.name);

デストラクタ

デストラクタは__destruct()関数に定義する。

Yuma ItoYuma Ito

アクセス修飾子

  • public: どこからもアクセスできるプロパティ/メソッド。デフォルト値。
  • protected: クラス内と派生クラスのみからアクセスできるプロパティ/メソッド。
  • private: クラス内のみからアクセスできるプロパティ/メソッド

継承

extendsを用いる。

class Strawberry extends Fruit {
}

finalキーワードをクラス名につけると継承を禁止することができる。

final class Fruit {
  // some code
}

// will result in error
class Strawberry extends Fruit {
  // some code
}

メソッドにfinalキーワードをつけるとオーバーライドを禁止できる。

class Fruit {
  final public function intro() {
    // some code
  }
}

class Strawberry extends Fruit {
  // will result in error
  public function intro() {
    // some code
  }
}
Yuma ItoYuma Ito

クラス定数

constを用いてクラス内で宣言する。

class Goodbye {
  const LEAVING_MESSAGE = "Thank you for visiting W3Schools.com!";
}

クラス名::定数名でアクセスできる

echo Goodbye::LEAVING_MESSAGE;
Yuma ItoYuma Ito

インターフェース

特に変わりはなし。interfaceで宣言して、implementsでインターフェースを実装する。

interface InterfaceName {
  public function someMethod1();
  public function someMethod2($name, $color);
  public function someMethod3() : string;
}

class ClassName implements InterfaceName{
  public function someMethod1(){ /* 略 */}
  public function someMethod2($name, $color){ /* 略 */}
  public function someMethod3(): string { /* 略 */ }
}
Yuma ItoYuma Ito

トレイト Traits

継承でなく、ある振る舞いを他の複数のクラスでも使えるようにする機能。(JavaScriptにはない概念。)

共通化したい振る舞いをtraitをつけて宣言する。

trait TraitName {
  // some code...
}

利用する側はuseを使って宣言する。

class MyClass {
  use TraitName;
}

例は以下。

trait message1 {
public function msg1() {
    echo "OOP is fun! ";
  }
}

class Welcome {
  use message1;
}

$obj = new Welcome();
$obj->msg1(); // OOP is fun!

https://www.php.net/manual/ja/language.oop5.traits.php

Yuma ItoYuma Ito

nullsafe 演算子 ?->

オブジェクトがnullだった場合、メソッドやプロパティを呼び出さずnullを返却する演算子。(PHP 8から導入)

// PHP 8.0.0 以降は、このように書けます:
$result = $repository?->getUser(5)?->name;

// これは、以下のコードチェックと同等です:
if (is_null($repository)) {
    $result = null;
} else {
    $user = $repository->getUser(5);
    if (is_null($user)) {
        $result = null;
    } else {
        $result = $user->name;
    }
}

https://www.php.net/manual/ja/language.oop5.basic.php#language.oop5.basic.nullsafe

参考:JavaScriptでは

Optional chaining演算子に相当する。nullではなくundefinedが返却される。

const result = repository?.getUser(5)?.name;
Yuma ItoYuma Ito

その他細かいもの

Yuma ItoYuma Ito

コメント

#でもコメントにできる

// This is a single-line comment
# This is also a single-line comment

/*
This is a multiple-lines comment block
that spans over multiple
lines
*/
Yuma ItoYuma Ito

事前定義された変数

https://www.w3schools.com/php/php_superglobals.asp

  • $GLOBALS: グローバル変数
  • $_SERVER: ヘッダやパス、スクリプトの場所に関する情報を保有している変数
  • $_REQUEST: HTMLフォームから送信されたリクエスト情報
  • $_POST: POSTメソッドで送られたリクエスト情報
  • $_GET: GETメソッドで送られたリクエスト情報
Yuma ItoYuma Ito

標準関数

文字列の操作など。

Yuma ItoYuma Ito

配列要素を文字列で連結する implode

implode(string $separator, array $array): string

// 例
$array = array('lastname', 'email', 'phone');
$comma_separated = implode(",", $array);

echo $comma_separated; // lastname,email,phone
参考:JavaScriptでは

Array.join()に相当する。

const array = ['lastname', 'email', 'phone'];
const commaSeparated = array.join(',');

console.log(commaSeparated); // lastname,email,phone
Yuma ItoYuma Ito

文字列の分割 explode

explode(string $separator, string $string, int $limit = PHP_INT_MAX): array

// 例
$pizza  = "piece1 piece2 piece3 piece4 piece5 piece6";
$pieces = explode(" ", $pizza);

echo $pieces[0]; // piece1
echo $pieces[1]; // piece2
参考:JavaScriptでは

String.split()に相当する。

const pizza = 'piece1 piece2 piece3 piece4 piece5 piece6';
const pieces = pizza.split(' ');

console.log(pieces[0]); //piece1
console.log(pieces[1]); // piece2
Yuma ItoYuma Ito

配列を操作する関数

Yuma ItoYuma Ito

配列の要素をフィルタリングする array_filter

array_filter(array $array, callable|null $callback = null, int $mode = 0): array

PHP: array_filter - Manual

配列の要素にコールバック関数を適用して配列を作る array_map

array_map(callable|null $callback, array $array, array ...$arrays): array

PHP: array_map - Manual
array_mapで配列のindexを使う - Qiita

array_mapを使って配列の要素をint型に変換する

$int_array = array_map('intval', $str_value);

コールバック関数を繰り返し配列に適用し、配列を変換する array_reduce

array_reduce(array $array, callable $callback, mixed $initial = null): mixed

PHP: array_reduce - Manual

配列を分割する array_chunk

array_chunk(array $array, int $length, bool $preserve_keys = false): array

PHP: array_chunk - Manual
※JavaScriptにはない。

Yuma ItoYuma Ito

配列の一部を切り出す array_slice

array_slice(
    array $array,
    int $offset,
    int|null $length = null,
    bool $preserve_keys = false
): array

PHP: array_slice - Manual

配列を結合する array_merge

array_merge(array ...$arrays): array

PHP: array_merge - Manual

PHP7.4からスプレッド構文...を使えるようになった。array_mergeよりパフォーマンスが良いとのこと。

$parts = ['apple', 'pear'];
$fruits = ['banana', 'orange', ...$parts, 'watermelon'];
// ['banana', 'orange', 'apple', 'pear', 'watermelon'];

PHP: 新機能 - Manual

変数が配列かどうか判断する is_array

is_array(mixed $value): bool

PHP: is_array - Manual

ユーザー定義関数により配列をソートする usort

usort(array &$array, callable $callback): bool

※元の配列が変化するので、要注意!利用する前に配列をコピーしてから実行すること!
PHP: usort - Manual
ソートに関する関数はいくつかある。
PHP: 配列のソート - Manual

Yuma ItoYuma Ito

配列のキーを返却する array_keys

array_keys(array $array): array
array_keys(array $array, mixed $search_value, bool $strict = false): array

search_value が指定された場合、 指定した値に関するキーのみが返されます。指定されない場合は、 array から全てのキーが返されます。
PHP: array_keys - Manual

array_search(mixed $needle, array $haystack, bool $strict = false): int | string | false

見つからない場合はfalseを返却する。
PHP: array_search - Manual