PHP勉強メモ
PHPの基礎文法まとめ
主にJavaScriptと異なる部分だけメモ。
以下のようにPHPを記述する部分はタグで囲む。
<?php ?>
文字列の連結
ドット.
で文字列同士を連結する。
$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";
配列
配列の初期化・要素の取得
$array = ["あ", "い", "う"];
echo $array[0]; // あ
配列の長さを取得count()
$array = ["あ", "い", "う"];
echo count($array); // 3
参考:JavaScriptの場合
const array = ['あ', 'い', 'う'];
console.log(array.length);
連想配列
array(
key => value,
key2 => value2,
key3 => value3,
...
)
で定義する。
例:
$scores = array(
"math" => 70,
"english" => 90,
"japanese" => 80
);
echo $scores["math"]; // 70
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
)
*/
組み込み関数
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);
※生成する値は暗号学的に安全ではないので注意。
変数のスコープ
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
定数
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;
3項演算子(Ternary Operator)
$x = expr1 ? expr2 : expr3
Null合体演算子 (Null coalescing Operator)
PHP7から導入。
$x = expr1 ?? expr2
関数
以下のように宣言する。
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;
}
match式
PHP8から導入。
$return_value = match (制約式) {
単一の条件式 => 返却式,
条件式1, 条件式2 => 返却式,
};
// 例
$result = match ($x) {
0 => "0です",
1 => "1です",
default => "その他です"
};
switch文と似ているが、いくつか異なる点がある。
- 厳密比較をする(switch文は緩い比較)
- 文ではなく式なので、値を返却する
- switch文のようにbreakがないと次の分岐に進む、ということはない。
- すべてのパターンを網羅する必要がある(制約式がどの分岐でも処理できなかった場合、
UnhandledMatchError
がスローされます。)
例外処理
try-catch
によって、例外を処理することができる。
try {
throw new Exception();
} catch (Exception $exception){
var_dump($exception);
}
アロー関数
PHP7.4から導入。
fn (argument_list) => expr
無名関数と異なり、親のスコープの変数を利用することができる。
$y = 1;
$fn1 = fn($x) => $x + $y;
// $y を値渡しするのと同じ
$fn2 = function ($x) use ($y) {
return $x + $y;
};
PHPでのクラスとか
OOPで必要なクラスなどについてまとめる。
クラスの宣言とプロパティ
クラスの宣言はJavaScriptと同じ。
プロパティへのアクセスは->
を用いる。
class Menu{
public $name;
}
$curry = new Menu();
$curry->name = 'CURRY';
echo $curry->name; // 'CURRY'
※プロパティを参照するときに$
は不要
コンストラクタ
コンストラクタは__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()
関数に定義する。
アクセス修飾子
- 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
}
}
クラス定数
const
を用いてクラス内で宣言する。
class Goodbye {
const LEAVING_MESSAGE = "Thank you for visiting W3Schools.com!";
}
クラス名::定数名
でアクセスできる
echo Goodbye::LEAVING_MESSAGE;
インターフェース
特に変わりはなし。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 { /* 略 */ }
}
トレイト 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!
?->
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;
}
}
参考:JavaScriptでは
Optional chaining演算子に相当する。null
ではなくundefined
が返却される。
const result = repository?.getUser(5)?.name;
その他細かいもの
コメント
#
でもコメントにできる
// 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
*/
事前定義された変数
-
$GLOBALS
: グローバル変数 -
$_SERVER
: ヘッダやパス、スクリプトの場所に関する情報を保有している変数 -
$_REQUEST
: HTMLフォームから送信されたリクエスト情報 -
$_POST
: POSTメソッドで送られたリクエスト情報 -
$_GET
: GETメソッドで送られたリクエスト情報
標準関数
文字列の操作など。
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
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
print_r
変数を読みやすいように出力する $array_string= print_r($array, true);
echo "basic_data: {$array_string}";
str_contains
部分文字列が文字列に含まれているか調べる str_contains(string $haystack, string $needle): bool
VSCodeの設定
拡張機能
標準クラス
DateTimeImmutable
日付と時刻を表現するクラス。
Exception
すべてのユーザー例外の基底クラス
PHP: Exception - Manual
配列を操作する関数
array_filter
配列の要素をフィルタリングする array_filter(array $array, callable|null $callback = null, int $mode = 0): array
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
array_chunk
配列を分割する array_chunk(array $array, int $length, bool $preserve_keys = false): array
PHP: array_chunk - Manual
※JavaScriptにはない。
array_slice
配列の一部を切り出す array_slice(
array $array,
int $offset,
int|null $length = null,
bool $preserve_keys = false
): array
array_merge
配列を結合する array_merge(array ...$arrays): array
PHP7.4からスプレッド構文...
を使えるようになった。array_merge
よりパフォーマンスが良いとのこと。
$parts = ['apple', 'pear'];
$fruits = ['banana', 'orange', ...$parts, 'watermelon'];
// ['banana', 'orange', 'apple', 'pear', 'watermelon'];
is_array
変数が配列かどうか判断する is_array(mixed $value): bool
usort
ユーザー定義関数により配列をソートする usort(array &$array, callable $callback): bool
※元の配列が変化するので、要注意!利用する前に配列をコピーしてから実行すること!
PHP: usort - Manual
ソートに関する関数はいくつかある。
PHP: 配列のソート - Manual
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
指定した値を配列で検索して最初のキーを返す array_search(mixed $needle, array $haystack, bool $strict = false): int | string | false
見つからない場合はfalse
を返却する。
PHP: array_search - Manual