BeginnerEngineerBlog
中の人
中の人

【小ネタ】phpで変数でメソッドを実行する

公開: 2022-01-05 23:49
更新: 2023-04-06 14:55
1709
php 備忘録 小ネタ
自分の備忘録としてphpの便利な小ネタを紹介したいと思います。覚えとくとどっかで役に立つかもしれません。

あけましておめでとうございます!

中の人です!

2022年になりましたね!

早速今年初の記事を書いていきますよ!

個人的な備忘録的な内容ですが、phpでメソッド(関数)を変数で実行するやり方を紹介したいと思います。

普通のファイルで文字列でメソッドを指定して実行


引数ありのやり方


やり方は以下になります。

<?php

// メソッドを定義
function method(string $string)
{
    echo $string;
}

// メソッド名を文字列で変数に定義
$action = 'method';

// 変数に入れたメソッドを実行する
$action('おすおす');


このファイルの実行結果は以下になります。



こんな感じで文字列でメソッド名を変数に定義するとそのメソッドを実行することができます。


引数なしの場合


ということで引数を指定しない場合はこうなります。

<?php

function method()
{
    echo 'おーすおす' . "\n";
}

$action = 'method';

$action();

この実行結果は以下になります。


とりあえずメソッド名を文字列で変数に格納して、「()」を後ろにつければ普通にメソッドを実行することができます。

では、メソッドを定義する前にメソッド名を変数に格納して実行するとどうなるかみてみましょう。


メソッド宣言する前に実行する


<?php

$action = 'method';

$action();

function method()
{
    echo 'おすおす。おすおす。' . "\n";
}

この実行結果は以下になります。



とうことでどこで定義しても実行できるようですね!


使用例


あまり使うイメージがわかないと思いますので、実際に私が使用した例を紹介します。

<?php

function first()
{
    echo 'ファーストおす!' . "\n";
}

function second()
{
    echo 'セカンドおす!' . "\n";
}

function osuosu(bool $first = null)
{
    $method = 'second';
    if ($first) {
        $method = 'first';
    }
    $method();
}

for ($i = 1;5 >= $i;++$i) {
    $bool = true;
    if ($i === 3) {
        $bool = false;
    }
    osuosu($bool);
}


このコードの実行結果は以下になります。


使用例なのでそのままメソッドを実行してもいいのですが、まぁこんな風にプログラム組めますよということで。

もう一つ変数でメソッドを実行するやり方を紹介します。

classのメソッドを変数で実行する


クラス内で使う場合


<?php

class Osu
{
    private $osuosu = 'プロパティおす!';

    public function getOsuArray()
    {
        $array = [];
        $osu = [$this, 'osuOsuOsuOsuOsuOsu'];
        for ($i = 1;5 >= $i;++$i) {
            switch ($i) {
                case 1:
                    $osu($array, 'first', 'ファーストおす!');
                    break;
                case 2:
                    $osu($array, 'second', 'セカンドおす!');
                    break;
                case 3:
                    $osu($array, 'third', 'サードおす!');
                    break;
                case 4:
                    $osu($array, 'fourth', 'フォースおす!');
                    break;
                case 5:
                    $osu($array, 'fifth', 'フィフスおす!');
                    break;
            }
        }

        return $array;
    }

    private function osuOsuOsuOsuOsuOsu(&$array, string $key, $value)
    {
        $array[$key] = $value;
    }

    public function echoOsu()
    {
        $echo = [$this, 'echoOsuOsuOsuOsuOsu'];
        return $echo();
    }

    private function echoOsuOsuOsuOsuOsu()
    {
        echo $this->osuosu . "\n";
    }
}

$osu = new Osu();

$osu_array = $osu->getOsuArray();

foreach ($osu_array as $key => $value) {
    echo 'key: ' . $key . ', value: ' . $value . "\n";
}

$osu->echoOsu();

この実行結果は以下になります。



こんな感じになります。

クラスの中で使う場合は

$osu = [$this, 'osuOsuOsuOsuOsuOsu'];

こんな感じで定義します。

メソッド名が長くて何度も書きたくない場合は使えるかもしれません。
私はまさにその理由で使いました。

あとは前述した普通のファイルで普通のファイルで文字列でメソッドを指定して実行と同じ感じで使用することができます。

クラスのメソッドを文字列で実行する


あとは、以下の感じでもメソッドを実行することができます。


~~省略

$osu = new Osu();

$array = 'getOsuArray';
$osu_array = $osu->$array();

foreach ($osu_array as $key => $value) {
    echo 'key: ' . $key . ', value: ' . $value . "\n";
}

$method = 'echoOsu';
$osu->$method();

この実行結果も上記と同じ様になります。


~~省略
$array = 'getOsuArray';
$osu_array = $osu->$array();

~~省略

$method = 'echoOsu';
$osu->$method();

こんな感じでメソッド名を定義してクラスのメソッドと同じ様に指定すると、そのメソッド名を実行することができます。

おわりに


まぁ、使うことあるかないかわかりませんが、知っておけばいずれ役に立つ日がくるかもです!
ただ、多用すると可読性が低くなりそうなので、使う場面は選んだ方がいいと思いますけどね!

ということで2022年もBeginnerEngineerBlogをよろしくお願いします!
0
0
0
0
通信エラーが発生しました。
【広告】
似たような記事