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

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

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

4回答

940閲覧

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

tesopgmh

総合スコア146

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2019/04/10 06:34

以下のように、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()」内で生成された変数をすべて取り出す方法を知りたいです
ご存知の方ご教授頂けますと幸いです

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

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

php

1function all_local_vars(){ 2 $initial_vars = array_keys(get_defined_vars()); 3 $foo = 0; 4 $bar = 'hoge'; 5 return compact(array_diff(array_keys(get_defined_vars()), $initial_vars)); 6}

3v4lでの動作検証


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

投稿2019/04/10 06:46

maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tesopgmh

2019/04/10 07:10

ありがとうございます 私の早とちりで get_defined_vars()はfunction内で呼び出せばそのスコープのみになるようでした しかし、maisumakunさんのdiffを利用する方法はめちゃくちゃ目からうろこです お教えいただいた方法は別の何かに使えそうなので頭に叩き込んでおきます ありがとうございました
guest

0

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

php

1<?php 2$str3 = 'aaaa'; 3class hode 4 5 { 6 static $str2 = ""; 7 static $arr2 = []; 8 static public 9 10 function huga1() 11 { 12 $test = 1; 13 $arr = self::huga2(); 14 var_dump($arr); 15 } 16 17 static public function huga2() 18 { 19 $str = 'aaa'; 20 $arr = array( 21 'bb', 22 'cc' 23 ); 24 $int = 9999; 25 $text = 'あああ'; 26 return get_defined_vars(); 27 } 28 29 static public function huga3() 30 { 31 self::$str2 = 'aaa2'; 32 self::$arr2 = array( 33 'bb', 34 'cc' 35 ); 36 } 37 } 38 39$var = hode::huga2(); 40var_dump($var); 41hode::huga3(); 42$var2 = hode::huga2(); 43var_dump($var2); 44hode::huga1(); 45/* 46array(4) { 47 ["str"]=> 48 string(3) "aaa" 49 ["arr"]=> 50 array(2) { 51 [0]=> 52 string(2) "bb" 53 [1]=> 54 string(2) "cc" 55 } 56 ["int"]=> 57 int(9999) 58 ["text"]=> 59 string(9) "あああ" 60} 61array(4) { 62 ["str"]=> 63 string(3) "aaa" 64 ["arr"]=> 65 array(2) { 66 [0]=> 67 string(2) "bb" 68 [1]=> 69 string(2) "cc" 70 } 71 ["int"]=> 72 int(9999) 73 ["text"]=> 74 string(9) "あああ" 75} 76array(4) { 77 ["str"]=> 78 string(3) "aaa" 79 ["arr"]=> 80 array(2) { 81 [0]=> 82 string(2) "bb" 83 [1]=> 84 string(2) "cc" 85 } 86 ["int"]=> 87 int(9999) 88 ["text"]=> 89 string(9) "あああ" 90} 91*/

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

投稿2019/04/10 06:51

編集2019/04/10 06:54
m.ts10806

総合スコア80850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tesopgmh

2019/04/10 07:10

ありがとうございます 仰る通り私の早とちりで get_defined_vars()はfunction内で呼び出せばそのスコープのみになるようでした
m.ts10806

2019/04/10 07:36 編集

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

0

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

投稿2019/04/10 06:48

kawax

総合スコア10377

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tesopgmh

2019/04/10 07:11

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

0

自己解決

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

投稿2019/04/10 06:41

tesopgmh

総合スコア146

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問