62756
PHPで関数外にある特定の変数を使用する際に関数に引数として渡すか`global`として定義するか  
についてですが、  
下記、①と②では実行結果は同じですが使い分けがよくわかっておりません。どのように使い分けるものなのでしょうか。  
特に`$hoge`を上書きするなどして書き換えるつもりはない場合に、どちらを使うのが適切なのかよくわかっていません。  
①

```

    $hoge = 'test';
    
    function func(){
      global $hoge;
    
      echo $hoge;
    }
    func();
    
```

②

```

    $hoge = 'test';
    function func($hoge){
      echo $hoge;
    }
    func($hoge);
    
```
CC BY-SA 4.0
2020-02-03T12:01:57.783
62747
2020-02-04T01:16:52.107
2020-02-03T14:47:45.490
2376
17348
question
php
PHPの関数で関数外の変数を扱う際について
globalはスコープを変更するので参照だけではなくて代入も影響があります。

```

    $hoge = 'test';
    
    function func(){
      global $hoge;
      $hoge = "test2";
    }
    echo $hoge;
    func();
    echo $hoge;
    
```

こんな感じで変数をどのスコープでも参照代入し更にその結果をスコープ外でも利用する場合に使います。

ただし、グローバルなスコープな変数の利用は、  
・IN/OUTが引数とリターン以外になってしまい分かりづらい  
・外のスコープで変数が変わってしまうため、純粋な関数ではなくなりがちになる。

```

    $hoge = 'test';
    
    class function func(){
      return "test2";
    }
    echo $hoge;
    $hoge = func();
    echo $hoge;
    
```

利用側で変数を定義したくなければ以下のようにクラス化するべきです。

```

    class Hoge
    {
      private $hoge;
      function __construct($test) {
        $this->hoge = $test;
      }
      function func(){
        $this->hoge = "test2";
        return 1;
      }
      function gethoge(){
        return$this->hoge;
      }
    }
    $Hoge = new Hoge('test');
    echo $Hoge->gethoge();
    $Hoge->func();
    echo $Hoge->gethoge();
    
```

個人的には最終手段、これをしないとプロダクトが破断してしまうときぐらいしか使わないですね。  
基本はきちんと引数、返り値でのIn/Outを意識 or クラス化をします。

例えば純粋な関数についての参考記事  
<https://qiita.com/Yametaro/items/3ec5a7d89afa1a0e9f15>
CC BY-SA 4.0
2020-02-04T01:16:52.107
62756
2020-02-04T01:16:52.107
22665
62747
answer