PHPのメソッド完全解説!初心者も理解できる15の実用例

PHPのメソッドを初心者向けに解説する記事のイメージPHP
この記事は約25分で読めます。

 

【サイト内のコードはご自由に個人利用・商用利用いただけます】

この記事では、プログラムの基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

基本的な知識があればカスタムコードを使って機能追加、目的を達成できるように作ってあります。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10,000時間以上』を凌駕する現役のプログラマチームによって監修されています。

サイト内のコードを共有する場合は、参照元として引用して下さいますと幸いです

※Japanシーモアは、常に解説内容のわかりやすさや記事の品質に注力しております。不具合、分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

はじめに

PHPは、ウェブサイト制作で非常に人気のあるサーバーサイドスクリプト言語です。

その強力な部分の一つは、”メソッド”と呼ばれる機能で、これがプログラムを組織化し、管理しやすくする上で重要な役割を果たしています。

この記事を読んでいただくことで、PHPのメソッドの作り方、使い方、そしてそれをうまく活用するための実例について深く理解することができます。

この一連の情報は、プログラミング初心者から経験者まで、幅広い読者にとって有益であることを保証します。

●PHPメソッドの基本的な作り方

○メソッドの定義

PHPでメソッドを定義する際は、まず「function」キーワードを使用します。

その後にメソッド名を指定し、その後ろに丸括弧「()」と波括弧「{}」を追加します。

これでメソッドの雛形が完成します。

function メソッド名() {
    // メソッドの内容
}

○メソッドの呼び出し方

定義したメソッドを呼び出すには、メソッド名とその後ろに丸括弧を記述します。

メソッド名();

●PHPメソッドの実用例とサンプルコード

それでは、PHPのメソッドの具体的な使い方について見ていきましょう。

様々な状況でのメソッドの使用例とサンプルコードを用意しました。

○サンプルコード1:基本的なメソッドの作成

次のコードは、「hello」というメソッドを定義し、その中で「Hello, world!」というメッセージを出力する例です。

このメソッドは特定のパラメータを必要とせず、呼び出すだけでメッセージを出力します。

function hello() {
    echo "Hello, world!";
}

hello();  // "Hello, world!"と出力します

このように、メソッドを作成することで、同じコードを何度も書く必要がなくなり、コードの再利用性が向上します。

○サンプルコード2:引数を使用するメソッド

メソッドは引数を受け取ることができ、これによりその動作をカスタマイズすることが可能です。

次のコードでは、名前を引数として受け取り、それを使用して個別の挨拶メッセージを出力する「greet」メソッドを示しています。

function greet($name) {
    echo "Hello, $name!";
}

greet("John");  // "Hello, John!"と出力します

引数を使用することで、メソッドはさらに柔軟性と再利用性を獲得します。

この例では、任意の名前で挨拶を行うことができます。

○サンプルコード3:戻り値を持つメソッド

メソッドは結果を「戻り値」として返すことができます。

これは、「return」キーワードを使用して実現します。

kaki

のコードでは、二つの数値を引数として受け取り、それらの積を戻り値として返す「multiply」メソッドを示しています。

function multiply($num1, $num2) {
    return $num1 * $num2;
}

$result = multiply(3, 4);  // $result には 12 が格納されます

このコードでは、3と4を引数としてmultiplyメソッドを呼び出し、その戻り値を$result変数に格納しています。

こうすることで、メソッドの結果を別の場所で使用することができます。

○サンプルコード4:静的(static)メソッド

静的メソッドは、オブジェクトを生成せずにクラスから直接呼び出すことができるメソッドです。

「static」キーワードを使用して定義します。

kaki

のコードでは、「Math」クラス内に「square」メソッドを定義し、これを静的メソッドとして呼び出す例を示しています。

class Math {
    public static function square($num) {
        return $num * $num;
    }
}

$result = Math::square(5);  // $result には 25 が格納されます

このコードでは、静的メソッドsquareを呼び出すために「Math::square(5)」という表記を使用しています。

これにより、Mathクラスのインスタンスを生成せずにsquareメソッドを利用できます。

この機能は、特定のインスタンスに依存しないメソッドを実装する際に便利です。

○サンプルコード5:パブリック(public)メソッドとプライベート(private)メソッド

PHPでは、クラス内のメソッドにはアクセス修飾子を設定できます。

アクセス修飾子にはパブリック(public)、プライベート(private)、そしてプロテクテッド(protected)があります。

ここではパブリックとプライベートに焦点を当てます。

下記のコードは、パブリックメソッドとプライベートメソッドの例を示しています。

class MyClass {
    public function publicMethod() {
        echo "publicMethodが呼び出されました\n";
    }

    private function privateMethod() {
        echo "privateMethodが呼び出されました\n";
    }

    public function callPrivate() {
        $this->privateMethod();
    }
}

$myClass = new MyClass();
$myClass->publicMethod();  // "publicMethodが呼び出されました"と出力します。
$myClass->callPrivate();  // "privateMethodが呼び出されました"と出力します。

このコードでは、MyClassクラスにパブリックメソッド(publicMethod)とプライベートメソッド(privateMethod)を定義しています。

パブリックメソッドは、クラスの外から直接呼び出すことが可能です。

一方、プライベートメソッドは、同じクラスの内部からのみ呼び出すことができます。

そのため、上記のコードでは、publicMethodメソッドとprivateMethodを呼び出すcallPrivateメソッドをクラスの外部から呼び出しています。

○サンプルコード6:ゲッターとセッター

ゲッターとセッターは、オブジェクト指向プログラミングにおいて頻繁に用いられるメソッドです。

ゲッター(getter)はプライベートプロパティの値を取得するために使われ、セッター(setter)はプライベートプロパティの値を設定するために使われます。

下記のコードは、ゲッターとセッターの例を示しています。

class User {
    private $name;

    // セッター
    public function setName($name) {
        $this->name = $name;
    }

    // ゲッター
    public function getName() {
        return $this->name;
    }
}

$user = new User();
$user->setName('John Doe');  // セッターを使って名前を設定
echo $user->getName();  // "John Doe"と出力します

このコードでは、Userクラスにプライベートプロパティ$nameと、そのゲッターとセッターを定義しています。

setNameメソッドを用いて$nameプロパティに値を設定し、getNameメソッドを用いてその値を取得しています。

このように、ゲッターとセッターを用いることで、クラスの内部構造をカプセル化し、プロパティに直接アクセスすることなくその値を操作できます。

○サンプルコード7:コンストラクタとデストラクタ

コンストラクタとデストラクタは、クラスの特殊なメソッドで、オブジェクトが生成されたり破棄されたりする際に自動的に呼び出されます。

コンストラクタは新しいオブジェクトが生成されるときに、デストラクタはオブジェクトがメモリから削除されるときに自動的に実行されます。

下記のコードは、コンストラクタとデストラクタの例を示しています。

class MyClass {
    function __construct() {
        echo "コンストラクタが呼び出されました\n";
    }

    function __destruct() {
        echo "デストラクタが呼び出されました\n";
    }
}

$myClass = new MyClass();  // "コンストラクタが呼び出されました"と出力します。
unset($myClass);  // "デストラクタが呼び出されました"と出力します。

このコードでは、MyClassクラスにコンストラクタ(__construct)とデストラクタ(__destruct)を定義しています。

新しいMyClassオブジェクトが生成されるときに、コンストラクタが自動的に呼び出されます。

そして、オブジェクトがunset関数により破棄されるときに、デストラクタが自動的に呼び出されます。

コンストラクタはオブジェクトの初期設定を行うのによく使われ、デストラクタはオブジェクトのクリーンアップ処理を行うのに使われます。

例えば、データベースへの接続を開くコンストラクタと、その接続を閉じるデストラクタを定義することができます。

○サンプルコード8:抽象(abstract)メソッド

抽象メソッドは、具体的な実装を持たないメソッドで、抽象クラス内に定義されます。

この抽象メソッドは、その抽象クラスを継承した具象クラスによって必ず実装されなければなりません。

以下のコードは、抽象メソッドの例を示しています。

abstract class AbstractClass {
    // 抽象メソッドの定義
    abstract protected function abstractMethod();

    // 抽象クラス内の普通のメソッド
    public function normalMethod() {
        echo "これは普通のメソッドです\n";
    }
}

class ConcreteClass extends AbstractClass {
    // 抽象メソッドの実装
    protected function abstractMethod() {
        echo "抽象メソッドが具体的に実装されました\n";
    }
}

$concreteClass = new ConcreteClass();
$concreteClass->normalMethod(); // "これは普通のメソッドです"と出力します。
$concreteClass->abstractMethod(); // "抽象メソッドが具体的に実装されました"と出力します。

このコードでは、AbstractClassという抽象クラスを定義し、その中にabstractMethodという抽象メソッドを定義しています。

ConcreteClassというクラスでは、この抽象メソッドを具体的に実装しています。

このように、抽象メソッドは具象クラスにおいて必ず具体的な形で実装されます。

抽象メソッドを用いることで、一部のメソッドがすべてのサブクラスで共通のシグネチャ(メソッド名とパラメータリスト)を持つことを強制できます。

これにより、異なる具象クラスでも一定の機能が保証され、コードの予測性が向上します。

○サンプルコード9:オーバーロードとオーバーライド

オーバーロードとオーバーライドはオブジェクト指向プログラミングの重要な概念で、ともにメソッドの名前が同じでも異なる挙動を実現するために使用されます。

オーバーライドは、スーパークラス(親クラス)のメソッドをサブクラス(子クラス)で新たに定義し直すことで、メソッドの挙動を変更します。

一方、PHPのオーバーロードは、異なる引数や引数の数で同じメソッド名を使うことはできませんが、プロパティやメソッドが呼び出された時に動的にその挙動を変更することができます。

下記のコードは、オーバーライドとオーバーロードの例を示しています。

class SuperClass {
    public function display() {
        echo "スーパークラスのメソッド\n";
    }
}

class SubClass extends SuperClass {
    // スーパークラスのメソッドをオーバーライド
    public function display() {
        echo "サブクラスでオーバーライドされたメソッド\n";
    }
}

$subClass = new SubClass();
$subClass->display();  // "サブクラスでオーバーライドされたメソッド"と出力します。

このコードでは、SuperClassというスーパークラスのdisplayメソッドを、SubClassというサブクラスで新たに定義し直すことにより、オーバーライドを実現しています。

サブクラスのオブジェクトでdisplayメソッドを呼び出すと、サブクラスで定義した新しいメソッドが実行されます。

class MyOverloadClass {
    private $properties = array();

    public function __set($property, $value) {
        $this->properties[$property] = $value;
    }

    public function __get($property) {
        return $this->properties[$property];
    }
}

$myOverloadClass = new MyOverloadClass();
$myOverloadClass->name = "MyName";  // __setメソッドが呼び出されます。
echo $myOverloadClass->name;  // "MyName"と出力します。 __getメソッドが呼び出されます。

このコードでは、MyOverloadClassクラスで__setと__getマジックメソッドを使用し、プロパティのセットとゲットを動的に処理することにより、オーバーロードを実現しています。

特定のプロパティにアクセスすると、__getや__setメソッドが自動的に呼び出され、それぞれプロパティの読み出しや書き込みの挙動を制御します。

○サンプルコード10:メソッドチェーン

メソッドチェーンとは、オブジェクト指向プログラミングにおいて、複数のメソッド呼び出しを一行で連続して行うスタイルのことを指します。

これを行うためには、各メソッドが自分自身のオブジェクトを返す必要があります。

これにより、次のメソッドがその返り値(つまりそのオブジェクト自身)に対して呼び出されます。

このスタイルはフルーエントインターフェースとも呼ばれ、コードの可読性を高めることができます。

下記のコードでは、メソッドチェーンを実現する簡単な例を示しています。

class SampleClass {
    private $value;

    public function setValue($value) {
        $this->value = $value;
        return $this;  // メソッドチェーンを可能にするため、自分自身を返します。
    }

    public function increment() {
        $this->value++;
        return $this;  // メソッドチェーンを可能にするため、自分自身を返します。
    }

    public function getValue() {
        return $this->value;
    }
}

$sample = new SampleClass();
echo $sample->setValue(5)->increment()->getValue();  // "6"と出力します。

このコードでは、SampleClassクラスのsetValueとincrementメソッドが、自分自身(つまり$this)を返すように定義されています。

そのため、setValueとincrementメソッドを連続して呼び出すことができます。

最後にgetValueメソッドを呼び出すことで、処理後の値を取得しています。

○サンプルコード11:マジックメソッド

マジックメソッドとは、PHPのクラスで特定の状況下に自動的に呼び出されるメソッドのことを指します。

これらのメソッド名は特定の形式(具体的には、二つのアンダースコア(__)で始まる名前)を持ちます。

下記のコードは、いくつかのマジックメソッドを実装したサンプルクラスを示しています。

class MagicSample {
    private $data = [];

    // コンストラクタ
    public function __construct() {
        echo "__constructが呼ばれました\n";
    }

    // デストラクタ
    public function __destruct() {
        echo "__destructが呼ばれました\n";
    }

    // 呼び出されたメソッドが存在しない場合に呼ばれる
    public function __call($name, $arguments) {
        echo "__callが呼ばれました: {$name}\n";
    }

    // 値をセットする
    public function __set($name, $value) {
        echo "__setが呼ばれました: {$name} => {$value}\n";
        $this->data[$name] = $value;
    }

    // 値を取得する
    public function __get($name) {
        echo "__getが呼ばれました: {$name}\n";
        return $this->data[$name] ?? null;
    }
}

$magic = new MagicSample();
$magic->data1 = 'test';  // __setが呼ばれる
echo $magic->data1;  // __getが呼ばれる
$magic->unknownMethod();  // __callが呼ばれる

このコードでは、__construct__destruct__call__set__getというマジックメソッドを利用しています。

コンストラクタは、新しくオブジェクトが生成されたときに自動的に呼び出されます。

デストラクタは、オブジェクトが不要になり、ガベージコレクションの対象となったときに呼び出されます。

__callメソッドは、呼び出そうとしたメソッドが存在しない場合に呼び出されます。

__setメソッドと__getメソッドは、それぞれプロパティの設定と取得の際に呼び出されます。

これらは、プロパティがprivateであるか、または存在しない場合に利用できます。

○サンプルコード12:無名関数(クロージャ)

無名関数(またはクロージャ)とは、名前を持たない関数のことを指します。

PHPでは、無名関数を変数に代入したり、引数や戻り値として利用することが可能です。

下記のコードでは、無名関数を作成し、変数に代入してから呼び出す例を示しています。

// 無名関数を変数に代入
$hello = function($name) {
    return "こんにちは、{$name}さん\n";
};

// 無名関数を呼び出す
echo $hello('山田');

このコードでは、$helloという変数に無名関数を代入しています。

その後、この無名関数を呼び出すために、$hello('山田')を実行しています。

この例では、無名関数を使って、’山田’という名前を引数に渡し、’こんにちは、山田さん’というメッセージを返しています。

無名関数は、一時的な処理やコールバック関数を作成する場合などに有効です。

一方、無名関数はその性質上、再利用性が低いので、再利用が必要な場合や複雑な処理を行う場合には、通常の名前付き関数の使用が推奨されます。

○サンプルコード13:コールバック関数

コールバック関数とは、ある関数が別の関数に対して処理を依頼し、その処理が完了した後で実行される関数を指します。

PHPでは、コールバック関数を引数として渡すことが可能です。

下記のコードでは、配列の各要素に対して関数を適用する array_map という関数に無名関数(コールバック関数)を渡しています。

// 配列の定義
$numbers = [1, 2, 3, 4, 5];

// array_mapにコールバック関数を渡す
$doubledNumbers = array_map(function($number) {
    // 数値を2倍にする
    return $number * 2;
}, $numbers);

// 結果を出力
print_r($doubledNumbers);

このコードでは、配列$numbersに対してarray_map関数を使って処理を行っています。

array_mapの第一引数に無名関数を指定し、この関数内で各要素を2倍にしています。

この例では、コールバック関数を使って配列の各要素を2倍にし、その結果を新たな配列$doubledNumbersに格納しています。

コールバック関数は一度だけの特定の処理を行う場合や、特定の関数内でのみ必要な処理を行う場合などに非常に有用です。

また、他の関数に処理を委譲することで、コードの再利用性を高めることも可能です。

しかし、コールバック関数が複雑になりすぎると、コードの理解が難しくなることもあるため、使用する際には注意が必要です。

○サンプルコード14:再帰関数

再帰関数とは、関数の中から自分自身を呼び出す関数のことを指します。

この性質を利用すると、繰り返し処理を行う際にループ構文を使わずに、シンプルかつ読みやすいコードを実現することができます。

ただし、無限に自分自身を呼び出すことがないよう、終了条件を明確に定めることが重要です。

再帰関数を用いて階乗を計算するPHPのコードを紹介します。

function factorial($n) {
    // 終了条件
    if ($n == 0) {
        return 1;
    }
    // 再帰呼び出し
    else {
        return $n * factorial($n - 1);
    }
}

// 結果を出力
echo factorial(5);  // 120

このコードでは、factorialという再帰関数を定義して、引数として与えられた数値の階乗を計算しています。

関数の内部では、引数$nが0になった場合は1を返す(これが再帰の終了条件)という処理を行っています。

一方、$nが0でない場合は、$nfactorial($n - 1)の積を返すことで再帰処理を行っています。

この例では、再帰関数を用いて階乗の計算を実現しています。

再帰関数はその特性上、処理の深さが深くなるほどスタックを大量に消費します。

そのため、適切な終了条件を設定しないとスタックオーバーフローを起こす可能性があります。

そのため、再帰関数を使う際は注意が必要です。

○サンプルコード15:ジェネレータ関数

ジェネレータ関数は、PHP5.5以降で使用可能な機能で、大量のデータを効率的に扱うことができます。

ジェネレータ関数はイテレータとして動作しますが、通常の関数とは異なり、一度にすべてのデータを返すのではなく、一つずつデータを返すため、メモリを節約することが可能です。

ジェネレータ関数は、yieldキーワードを使用して定義します。

0から始まる無限の整数列を生成するジェネレータ関数を紹介します。

function infinite_integers() {
    $i = 0;
    while (true) {
        yield $i++;
    }
}

foreach (infinite_integers() as $num) {
    if ($num >= 10) {
        break;
    }
    echo $num . PHP_EOL;  // 0から9まで出力
}

このコードでは、infinite_integersというジェネレータ関数を定義し、その中で無限ループを行いつつ、各ループで整数$iをyieldしています。

この関数をforeachで回すことで、0から始まる無限の整数列を生成しています。

ただし、無限ループにならないように、if文で$numが10以上になったらループから抜け出すようにしています。

この例では、ジェネレータ関数を使って大量のデータを効率的に扱う方法を示しています。

ジェネレータ関数は、大量のデータを扱う場合や、計算結果が順次必要な場合などに非常に有効です。

ただし、ジェネレータ関数内での例外処理や、複数のyieldを含む複雑な制御フローは理解やデバッグが難しくなるため注意が必要です。

●PHPメソッドの注意点と対処法

PHPでメソッドを扱う際には、いくつかの注意点が存在します。

それらを理解し、適切に対処することで、より安全かつ効率的なプログラムを実現できます。

1.参照渡しと値渡し

PHPのメソッドはデフォルトで引数を値渡しします。

つまり、メソッド内で引数を変更しても、元の変数には影響がありません。

しかし、引数の前に”&”を付けることで参照渡しを行い、メソッド内で引数を変更すると元の変数も変更されます。

これはパフォーマンスの観点から重要な点であり、大きなデータ構造を引数として渡す際には参照渡しを使用すると良いでしょう。

function add_prefix(&$string) {
    $string = 'prefix_' . $string;
}

$myString = 'original';
add_prefix($myString);
echo $myString;  // "prefix_original" と出力される

このコードでは、add_prefixという関数に&$stringという引数を取り、その引数に対してプレフィックスを追加する操作を行っています。

元の変数$myStringの値もこの関数によって変更されています。

2.デフォルト引数値

メソッドでは、引数にデフォルト値を設定することができます。

これにより、引数を省略した場合でもメソッドが正常に動作します。

ただし、デフォルト値を持つ引数は、デフォルト値を持たない引数よりも後ろに置く必要があります。

function greet($name, $message = 'Hello') {
    echo "$message, $name!";
}

greet('Alice');  // "Hello, Alice!" と出力される
greet('Bob', 'Good morning');  // "Good morning, Bob!" と出力される

このコードでは、greet関数には二つの引数$name$messageがありますが、$messageにはデフォルト値’Hello’が設定されています。

引数$messageを省略して関数を呼び出すと、デフォルト値が使用されます。

以上のように、PHPのメソッドを扱う際には、参照渡しやデフォルト引数値といった特性を理解しておくことが重要です。

それぞれの特性がもたらすメリットとデメリットを理解し、適切な場面で使い分けることが求められます。

●PHPメソッドのカスタマイズ方法

PHPのメソッドは、自由にカスタマイズすることができます。

このセクションでは、具体的なカスタマイズ方法とその例を見てみましょう。

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

クラス継承において、親クラスのメソッドを子クラスで再定義(オーバーライド)することが可能です。

この機能を活用すれば、既存のメソッドの挙動を自由にカスタマイズできます。

class ParentClass {
    public function sayHello() {
        echo "Hello from ParentClass";
    }
}

class ChildClass extends ParentClass {
    public function sayHello() {
        echo "Hello from ChildClass";
    }
}

$child = new ChildClass();
$child->sayHello();  // "Hello from ChildClass" と出力される

このコードでは、ParentClasssayHelloメソッドをChildClassでオーバーライドしています。

その結果、ChildClassのインスタンスでsayHelloメソッドを呼び出すと、”Hello from ChildClass”というメッセージが出力されます。

2.メソッドの動的呼び出し

PHPでは、メソッドの名前を文字列として変数に保持し、その変数を用いてメソッドを動的に呼び出すことができます。

これにより、実行時にメソッドの挙動を変更することが可能となります。

class MyClass {
    public function methodOne() {
        echo "Method One was called";
    }

    public function methodTwo() {
        echo "Method Two was called";
    }
}

$myObject = new MyClass();
$method = 'methodOne';
$myObject->$method();  // "Method One was called" と出力される

$method = 'methodTwo';
$myObject->$method();  // "Method Two was called" と出力される

このコードでは、MyClassに定義されているmethodOnemethodTwoというメソッドを、変数$methodを用いて動的に呼び出しています。

これにより、実行時にどのメソッドを使用するかを自由に変更することができます。

以上のように、PHPのメソッドは多彩なカスタマイズが可能です。

メソッドのオーバーライドや動的呼び出しをうまく利用することで、より柔軟なコードの実装が可能となります。

まとめ

PHPのメソッドを理解し、適切に活用することで、再利用性の高いコードを作成し、プログラムの複雑性を管理することが可能になります。

この記事では、PHPメソッドの基本的な利用方法から、無名関数(クロージャ)、コールバック関数、再帰関数、ジェネレータ関数などの高度な機能までを詳しく見てきました。

さらに、PHPメソッドの注意点としては、メソッド内での変数スコープ、メソッド名の衝突、メソッドの可視性とアクセス修飾子について把握しておく必要があります。

これらの要素を理解することで、エラーや予期しない動作を避けることが可能になります。

そして最後に、メソッドのカスタマイズについて触れました。

メソッドのオーバーライドや動的呼び出しによって、より柔軟で再利用性の高いコードを実装することができます。

PHPメソッドはその形状や使用方法が多岐にわたりますが、基本的な概念と使用方法を理解し、適切に使用することで、コードの品質と効率性を向上させることができます。

ぜひ、本記事で学んだ内容を活用して、PHPプログラミングのスキルを一段と深めてください。