PHPのマジックメソッド_callの使い方を現役エンジニアが解説【初心者向け】

初心者向けにPHPのマジックメソッド_callの使い方について現役エンジニアが解説しています。マジックメソッドとは、特定の操作が行われた場合に自動的に呼び出されるメソッドです。アクセス不能なメソッドにおいては_callが使用されます。

TechAcademyマガジンはオンラインのプログラミングスクールTechAcademy [テックアカデミー]が運営。初心者向けに解説した記事が4,000以上あります。現役エンジニアの方はこちらをご覧ください。

今回は、PHPのマジックメソッド_callの使い方について、TechAcademyのメンター(現役エンジニア)が実際のコードを使用して初心者向けに解説します。

 

PHPについてそもそもよく分からないという方は、PHPとは何なのか解説した記事を読むとさらに理解が深まるでしょう。

 

なお本記事は、TechAcademyのオンラインブートキャンプPHP/Laravel講座の内容をもとに紹介しています。

 

田島悠介

今回は、PHPに関する内容だね!

大石ゆかり

どういう内容でしょうか?

田島悠介

PHPのマジックメソッド_callの使い方について詳しく説明していくね!

大石ゆかり

お願いします!

 

PHPのマジックメソッドとは

マジックメソッドとは、特定の操作が行われた場合に自動的に呼び出される特殊なメソッドです。

基本的に直接呼び出さずに未定義のプロパティやメソッドにアクセスするなど、マジックメソッドは「 __construct()」、「__destruct()」のようにアンダースコア2つで始まります。

 

__callメソッドの使い方

マジックメソッドの一つ「__call()」メソッドは、アクセス不能なメソッドを実行しようとしたタイミングで呼び出されるものです。

アクセス不能というのは、下記のような形でメソッドが存在しないため、外部から実行できない状態となっています。

  • private
  • protected

__call()は、ユニットテストで使用するモックオブジェクト、スタブを作るときなどに便利です。

また、__call()を使って柔軟に外部からアクセスできるメソッドであるアクセサーを作ることも可能です。

 

[PR] PHPのプログラミングで挫折しない学習方法を動画で公開中

実際に書いてみよう

ここでは、__call()の使用例を見ていきましょう。

__call()を使用せずにアクセス不能メソッドを実行した場合は、下記のようになります。

<?php
class MagicMethod { 
}
$obj = new MagicMethod(); 
$obj->func();

結果として、「Fatal error: Call to undefined method hoge::func()」というエラーが表示されるでしょう。

上記のソースに__call()を追記した場合どうなるかみてみましょう。

<?php
class MagicMethod{
   public function __call($name, $args) {
       echo "call {$name}\n";
       var_dump($args);
   } 
}
$obj = new MagicMethod();
$obj->func();

 

実行結果

call func
array(0) {
}

上記のソースを実行すると、func()はMagicMethodクラスに存在しないアクセス不能なメソッドであるため、__call()が呼び出され__call()内の処理が実行されるでしょう。

メソッド名「func」は、__call()の第一引数$nameに格納され、func()に引数を渡すと第二引数$argsに配列の要素として格納されます。

下記は、func()に引数を渡した例です。

<?php
class MagicMethod{
   public function __call($name, $args) {
       echo "call {$name}\n";
       var_dump($args);
   } 
}
$obj = new MagicMethod();
$obj->func(1, 2, 'abc', array(1,2,3));

 

実行結果

call func
array(4) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  string(3) "abc"
  [3]=>
  array(3) {
    [0]=>
    int(1)
    [1]=>
    int(2)
    [2]=>
    int(3)
  }
}

 

執筆してくれたメンター

平野大輝(ひらのだいき)

スキル:PHP・Java・JavaScriptを用いて様々なアプリを開発するWebエンジニア。

 

大石ゆかり

PHPのマジックメソッド_callの使い方が分かりやすくて良かったです!

田島悠介

ゆかりちゃんも分からないことがあったら質問してね!

大石ゆかり

分かりました。ありがとうございます!

 

TechAcademyでは、初心者でも最短4週間で、PHPやフレームワークのLaravelを使ってWebアプリケーション開発を習得できる、オンラインブートキャンプを開催しています。

また、現役エンジニアから学べる無料体験も実施しているので、参加してみてください。