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

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

ただいまの
回答率

87.78%

PHP function内でfunctionを呼び出す。

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 560

score 20

前提・実現したいこと

function.php内に下記のような記述があります。

function test($name){

  if($name == 'store-a'){

      $GLOBALS['test_name'] = 'aです';

  } elseif ($name == 'store-b'){

      $GLOBALS['test_name'] = 'bです';

  }

}

function test_view(){

    $store =  ["store-a", "store-b"];

    foreach($store as $val){

        test($val);

    echo $test_name;
    }
}
  <?php require('function.php'); ?>
  <?php store_page(); ?>

HTMLファイルからstore_page()を呼び出して【aですbです】と表示されるようにしたいです。

発生している問題・エラーメッセージ

    require('function.php');
    $store =  ["store-a", "store-b"];

    foreach($store as $val){

      test($val);

      echo $test_name;
    }


これの結果は正常に【aですbです】と表示されます。
うまく表示されないのは下記のコードです。

    require('function.php');
    test_view();


これは何も帰ってきません。test_view()内で呼び出しているtest($val)の関数が正常に動いていないように思います。

試したこと

関数を入れ子にしてみましたがダメでした。1日悩みましたがお手上げです。ご教示いただけますと幸いです。

補足情報(FW/ツールのバージョンなど)

PHP 7.3.12
HTML5

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • m6u

    2020/01/21 19:10 編集

    問題点がよくわからないです。問題点を整理するために、第三者の環境でも動作できそうなミニマルなコードを起こし直してみると良いです。(質問内に示していないひみつなコードの存在など)質問者さんの抱えている環境でしか動かないコードは、誰も試せないので、カンのいい人にしか伝わらないので回答率が下がります。また、「ダメでした」とは具体的に何が起きたのか、エラーメッセージがどこかに残されたのか、客観的に分かる情報を添えてほしいです。

    キャンセル

  • mobile105

    2020/01/21 19:37

    ご連絡ありがとうございます。
    実際のコードより大分簡素化したつもりでしたがディレクトリから配列を取得するコードが混ざっていたりして回答者様の方でテスト出来るコードではなかったため修正させていただきました。
    試したことについては改めて追記させていただきたいと思います。

    キャンセル

回答 1

checkベストアンサー

+3

test_view() で、global の test_name を echo すると表示できると思います。

echo $GLOBALS['test_name']

ただ、そもそも設計がおかしいのでは?

何がやりたいのかちょっと理解できていないので投げやりなサンプルですが、一般的には以下のように global を使用せず書くと思います。

<?php
function test($name){
  if($name == 'store-a'){
      return 'aです';
  } elseif ($name == 'store-b'){
      return 'bです';
  }
}

function test_view(){
    $store =  ["store-a", "store-b"];
    foreach($store as $val){
        echo test($val);
    }
}

test_view();

追記
関数を作らなくても配列で良いのでは?

<?php
$arr = [
    'store-a' => [
        'name' => 'aaaa',
        'address' => '北海道○○市',
        'phone_number' => '000-000-0000',
        ],
    'store-b' => [
        'name' => 'bbbb',
        'address' => '青森県○○市',
        'phone_number' => '000-000-0000',
        ],
    ];

var_dump($arr['store-a']);
array(3) {
  ["name"]=>
  string(4) "aaaa"
  ["address"]=>
  string(18) "北海道○○市"
  ["phone_number"]=>
  string(12) "000-000-0000"
}

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2020/01/21 20:40

    おっしゃる通りecho $GLOBALS['test_name']としたら表示できました!呼び出している変数がローカルになっているのは完全に盲点でした...
    設計に関してですがfunction test($name)の中身は本来下記のような形で定義し、色んな所からfunction test($name)を呼び出しファイル名に応じて取得する店舗の情報を変化させるといった具合で使用するのですがこの場合でもグローバル変数を定義する以外に何かいい方法はありますでしょうか??
    全く実務経験がないものでこういうケースは一般的にどのように処理するのか分かっておらず見苦しいコードかもしれませんがご教示いただけますと幸いです。

    ```PHP
    function test($name){
    if($name == 'store-a'){

    $GLOBALS['name'] = 'aaaa'
    $GLOBALS['address'] = '北海道○○市'
    $GLOBALS['phone_number'] = '000-000-0000'

    } elseif ($name == 'store-b'){

    $GLOBALS['name'] = 'bbbb'
    $GLOBALS['address'] = '青森県○○市'
    $GLOBALS['phone_number'] = '000-000-0000'

    }
    }
    ```

    キャンセル

  • 2020/01/22 00:10

    追記しました。

    キャンセル

  • 2020/01/22 01:46

    ありがとうございます。配列の方がやはり速度面やメンテナンス性の面で優れるのでしょうか。一度その辺は調べてみようと思います。
    非常に勉強になりました。ありがとうございます。

    キャンセル

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

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

関連した質問

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