質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.78%

PHPでfunction内で生成された変数をすべて取り出したい

解決済

回答 4

投稿

  • 評価
  • クリップ 0
  • VIEW 386

tesopgmh

score 106

以下のように、huga2で生成された変数のみを
「すべて取り出して」huga1で再利用したいです

class hode{

   static public function huga1(){

      self::huga2();

      //ここで、$str,$arr,$intなどを使いたい
   }

   static public function huga2(){

      $str = 'aaa';
      $arr = array('bb','cc');
      $int = 9999;

   }
}

以下のように変数を「指定」して、return + list で受け取れば期待する結果にはなると思いますが
huga2内で変数が増えた場合にreturn + listの変数の受け渡しを調整しなければいけないので
調整なしで「すべて受け渡す方法」が知りたいです

class hode{

   static public function huga1(){

      list($str,$arr,$int) = self::huga2();

      //2.ここで$textを呼び出すには、都度return + listの調整が必要
   }

   static public function huga2(){

      $str = 'aaa';
      $arr = array('bb','cc');
      $int = 9999;

      //1.例えば新たにtextが増えた場合
      $text = 'あああ';

      return array($str,$arr,$int);

   }
}

また、要望に近い機能で「get_defined_vars + extract」なんかも利用可能かななんて思うのですが
グローバル変数含めたすべての値も対象とのことで意図しないセキュリティリスクにならないか心配です

class hode{

   static public function huga1(){

      $arr = self::huga2();
      extract($arr);

      //期待する動作に近いがこの方法はなんか怖い

   }

   static public function huga2(){

      $str = 'aaa';
      $arr = array('bb','cc');
      $int = 9999;
      $text = 'あああ';

      return get_defined_vars();

   }
}

よって前で出した二つの方法以外で
「huga2()」内で生成された変数をすべて取り出す方法を知りたいです
ご存知の方ご教授頂けますと幸いです

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

+2

get_defined_varsを工夫して使ってみてはいかがでしょうか(参考)。

function all_local_vars(){
  $initial_vars = array_keys(get_defined_vars());
  $foo = 0;
  $bar = 'hoge';
  return compact(array_diff(array_keys(get_defined_vars()), $initial_vars));
}

3v4lでの動作検証


いちおう狙った動作は可能ではありますが、そもそも論として何が返ってくるかはっきりしない関数というのは使いづらいので、インターフェース自体がそれでいいのか疑問ではあります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/04/10 16:10

    ありがとうございます

    私の早とちりで
    get_defined_vars()はfunction内で呼び出せばそのスコープのみになるようでした

    しかし、maisumakunさんのdiffを利用する方法はめちゃくちゃ目からうろこです
    お教えいただいた方法は別の何かに使えそうなので頭に叩き込んでおきます

    ありがとうございました

    キャンセル

check解決した方法

0

すみません、get_defined_vars()はfunction内で呼び出せばそのスコープのみになるんですね
後者の自分が示した方法で解決いたしました、おさわがせしました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

extract()はWordPressでさえ使わないように言ってる危険な関数…。
class内ならクラス変数にすればいいだけなのでは。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/04/10 16:11

    はい、なんか怖いですよね

    キャンセル

0

get_defined_vars()だけでできてませんか?

<?php
$str3 = 'aaaa';
class hode

    {
    static $str2 = "";
    static $arr2 = [];
    static public

    function huga1()
        {
        $test = 1;
        $arr = self::huga2();
        var_dump($arr);
        }

    static public function huga2()
        {
        $str = 'aaa';
        $arr = array(
            'bb',
            'cc'
        );
        $int = 9999;
        $text = 'あああ';
        return get_defined_vars();
        }

    static public function huga3()
        {
        self::$str2 = 'aaa2';
        self::$arr2 = array(
            'bb',
            'cc'
        );
        }
    }

$var = hode::huga2();
var_dump($var);
hode::huga3();
$var2 = hode::huga2();
var_dump($var2);
hode::huga1();
/*
array(4) {
  ["str"]=>
  string(3) "aaa"
  ["arr"]=>
  array(2) {
    [0]=>
    string(2) "bb"
    [1]=>
    string(2) "cc"
  }
  ["int"]=>
  int(9999)
  ["text"]=>
  string(9) "あああ"
}
array(4) {
  ["str"]=>
  string(3) "aaa"
  ["arr"]=>
  array(2) {
    [0]=>
    string(2) "bb"
    [1]=>
    string(2) "cc"
  }
  ["int"]=>
  int(9999)
  ["text"]=>
  string(9) "あああ"
}
array(4) {
  ["str"]=>
  string(3) "aaa"
  ["arr"]=>
  array(2) {
    [0]=>
    string(2) "bb"
    [1]=>
    string(2) "cc"
  }
  ["int"]=>
  int(9999)
  ["text"]=>
  string(9) "あああ"
}
*/

見た感じ、どのタイミングでvar_dump()してもhode::huga2()で定義された変数だけが出力されているように見受けられます。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/04/10 16:10

    ありがとうございます

    仰る通り私の早とちりで
    get_defined_vars()はfunction内で呼び出せばそのスコープのみになるようでした

    キャンセル

  • 2019/04/10 16:36 編集

    検証パターンを増やす必要がありますね。
    私が今回やったように色々無駄に書いてみると良いです。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.78%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る