🧐

PHPの配列、クラス、インターフェースについて理解する。

に公開

PHPの配列とクラス、インターフェースの主な使い方についてまとめました。

配列

追加

$array = [1,2,3];
$array[] = 4; // 配列の最後に追加 出力:[1,2,3,4]
array_push($array,5,6); // 複数追加の場合はarray_push 出力:[1,2,3,4,5,6]
array_unshift($array,0); // 配列の先頭に追加  出力:[0,1,2,3,4,5,6]

// 連想配列
$array_2 = ['red' => 'apple' , 'yellow' => 'banana'];
$array_2['pink'] = 'momo'; // 出力;['red' => 'apple' , 'yellow' => 'banana' , 'pink' => 'momo'];

挿入

$array = [1,2,4];
array_splice($array,2,0,3); // 出力:[1,2,3,4]

array_splice(対象の配列,挿入するインデックス番号,削除する数,挿入する値)になってます。
なので追加だけの場合は第三引数は0にします。

削除

$array = [1,2,3,4,5,6];
array_pop($array); // 末尾の要素を削除 出力[1,2,3,4,5]
array_shift($array); // 先頭の要素を削除 出力[2,3,4,5]
array_splice($array,2,2) // 特定の位置からの削除 出力[2,3]

// 連想配列
$array_2 = ['red' => 'apple' , 'yellow' => 'banana'];
unset($array_2['red']); // 出力;['yellow' => 'banana']

連装配列の削除はunset(配列[キー])で行う。

結合

$arr_1 = [1,2,3];
$arr_2 = [4,5,3];
$mergedArray_1 = array_merge($arr_1,$arr_2); // 出力: [1,2,3,4,5,3]

// 連想配列
$arr_3 = ['red' => 'apple' , 'yellow' => 'banana'];
$arr_4 = ['red' => 'cheery' , 'green' => 'watermelon'];
$mergedArray_2 = array_merge($arr_3,$arr_4); // 出力: ['red' => 'cheery' , 'yellow' => 'banana' , 'green' => 'watermelon']

array_merge()は引数の配列を全て結合して新しい配列として返す。
配列の場合、重複してる要素があってもそのまま結合して返す。
連装配列の場合、重複しているキーは上書きされて返されるので注意が必要。

mapメソッド

$array = [1,2,3,4,5];
$squaredArray = array_map(function($value){
  return $value ** 2;
  },$array); // 出力:[1,4,9,16,25]

// 連想配列
$array_2 = [['id' => 1 , 'price' => 300],['id' => 2 , 'price' => 200],['id' => 3 , 'price' => 500]];
$taxedArray = array_map(function($elem){
  $elem['price'] *= 1.1; // 税込み価格のリストにして返す関数
  return $elem;
},$array_2); // 出力:[['id' => 1 , 'price' => 330],['id' => 2 , 'price' => 220],['id' => 3 , 'price' => 550]]

array_map()は第一引数に配列内の要素に対し、処理を行う関数。第二引数以降で対象となる配列を渡す。

クラス

作成、継承、インスタンス

class Human {} // クラスの作成
class Student extends Human {} // 親クラスを継承
$student = new Student(); // インスタンスの作成

メソッド、プロパティの定義

class Human
{
    private $gender = '女性';  // クラス内で変数(プロパティ)を宣言
    protected function man() // メソッドを定義
    {
        echo '男性'; 
    }
    public function female()
    {
        echo $this->gender;
    }
}
$human = new Human();
$human->gender; // privateのため、エラー
$human->man(); // protectedのため、エラー
$human->female(); // publicなので問題なし。 出力:女性

privateはそのクラスの中で利用可能な修飾子。最も強力。オーバーライドもできない。
protectedはそのクラスと継承してるすべてのクラス内部で利用可能。
publicはクラス外部のすべてで利用可能。最も緩い。

コンストラクタの宣言

class Human
{
    public $family = 'ヒト科';
    public $gender;
    public function __construct($gender)
    {
        $this->gender = $gender;
    }
}

$human = new Human('男性');

public function __constructでコンストラクタを宣言することができる。
コンストラクタはインスタンスを作成した時に、呼び起される関数。

子クラスでのコンストラクタ継承

class Student extends Human
{
    public $grade;
    public function __construct($gender, $grade)
    {
        parent::__construct($gender);
        $this->grade = $grade;
    }
}
$student = new Student('男性','1年生');

parent::__construct()で親クラスのコンストラクタを呼び出せる。

定数の宣言

class Human
{
    public const FAMILY = 'ヒト科'; // 定数の宣言 
    public function belong()
    {
        echo self::FAMILY; //  定数の呼び出し
    }
}
echo Human::FAMILY // クラス外からの呼び出し。

constで定数を宣言できる。定数を呼び出す場合はself::定数名で呼び出す。
クラス外から呼び出すときはクラス名::定数名で呼び出す。

staticプロパティ

class Human
{
    public static $man = '男';
    public static function belong()
    {
        echo '人間'; 
    }
}
Human::belong(); // インスタンス無しに呼び出せる。
Human::$man;

staticはインスタンスを作成せずとも、::演算子を使って呼び出すことができる。

インターフェース

インターフェースとはクラスのメソッドについての設計書を表したようなもの。
これを引き継ぐことで、そのクラスについての機能に保証を持たせる事ができる。

インターフェースに必要なもの

  • メソッドについての名前や引数の型、戻り値の型などを記載する
  • メソッドの具体的な処理については記載しない。
  • 宣言されるメソッドは全てpublicである

以下はプログラミング言語のインターフェースを使用した例

// インターフェースの設定
interface ProgrammingLang{
    public function language(float $version): void;
}

// インターフェースの使用
class Python implements ProgrammingLang {
    // インターフェースの仕様を満たしている必要がある。
    public function language(float $version): void {
        echo "Python バージョン:{$version}";
    }
}

class PHP implements ProgrammingLang {
    public function language(float $version): void {
        echo "PHP バージョン:{$version}";
    }
    // インターフェースに定義されていない独自メソッドを使用することもできる。
    public function framework(): void {
        echo 'laravel';
    }
}

class Javascript implements ProgrammingLang {
    // これはインターフェースの仕様を満たしていないのでエラーになる。
    public function framework(): void {
        echo 'React';
    }
}

function output (ProgrammingLang $target , float $version) {
    $target->language($version);
}

// 呼び出す
output(new Python() , 3.12);
output(new PHP() , 8.4);

interface でインタフェースを定義する事ができる。
implementsでインターフェースを使用する事ができる。

終わり

以上です。

Discussion