こんにちは!
株式会社オズビジョン 開発グループのShoと申します。
私は2019年9月に入社して、webエンジニアへジョブチェンジしました。
エンジニア歴約3ヶ月で未経験入社の新人です。29歳です。
大学出てからの約7~8年はずっと営業職でした。
というわけで今は知識も技術力もない私ですが、脱未経験エンジニア目指して頑張ります!!
(入社前に3ヶ月くらい勉強してCRUD機能実装できる程度です)
今はPHP/JavaScript/TypeScript/React/ReactNativeで、
自社Webサービスの開発(バックエンドもフロントエンドも)を行なっています。
入社する前にはプログラミングスクールでRubyを学んで、Ruby On Railsでのアプリケーション開発の仕方を学んでいましたが、入社を機にPHPerデビューしました。
そんな私が業務の中で、学んだことを書いていきます。
今回はPHPのマジックメソッド
__call
についてです。
他にもマジックメソッドは存在しますが。
このメソッドについて理解がなく、機能改修の時に悩みました。
#背景
担当しているサービスにて機能改修を任されました。
とりあえず改修対象にあたりをつけるべくコードを読み進め、
該当の処理が行われている関数を探していました。
「なるほど、hoge関数が呼ばれるぽいな。。。」
「controllerはここか」
「hogeで検索...」
「該当なし」
「?!」
「存在しない!!」
詰んだ!
分かりにくいですが、関数が存在していなく、どんなに探しても見つけられませんでした。
そこで使われていたのがマジックメソッド_callでした。
#マジックメソッド (__call)
###マジックメソッドとは
ものすごく簡単に言うと、マジックメソッド__callを使用すると、
定義されていないメソッドでも処理を実行することができます。
privateやprotectedも間接的に呼び出すことが可能です。
※private メソッドの呼び出しは PHP 5.3 以降から。
###挙動例
class callClass
{
// __call(マジックメソッド)
public function __call($name, $hoge)
{
if($name == 'publicFuncAlias') {
// publicメソッド呼び出し
$this->publicFunc($hoge);
} else {
// 存在しないメソッド名の時ははリターン
if(!method_exists($this, $name)) { return false; }
// class内のprivate / protected メソッドの呼出
$this->{$name}($hoge);
}
}
# publicFunc はマジックメソッド経由だけでなく、直接呼び出されることもあるので
# デフォルトパラメータを付けておかないと、下記のエラーとなる
# Warning: Missing argument 1 for callClass::publicFunc(), called in ・・・
public function publicFunc($hoge = null)
{
echo "I am public method\n";
}
$call = new callClass();
// publicメソッドをマジックメソッドで呼び出す。
$call->publicFuncAlias();
// 結果
// I am public method
存在しないはずのpiblicFuncAlias
を呼び出して実行することができました!
デバッグしてる時に、該当する関数が見つからない時はマジックメソッドを通して呼び出されているかもしれません。
__construct コンストラクターもマジックメソッドの一つですね(今回ので気付きました)
他にも
__get
__set
などなど種類があるようなので学習を深めたいと思います。