

ある参考書籍(「詳細PHP7 + MySQL入門ノート」p220)  
に以下のように書いてあります。<参考書籍>内の【】でくくってある部分

//【$nameは同名のローカル変数を探すため】値はnullです。

の部分ですが、この場合「ローカル変数」の「ローカル」とは

①hello()以下の{}で囲まれたスコープの範囲内ということでしょうか？

②それとも下記の<記述>内にある class OurList以下の{}で囲まれたクラスの定義内という意味でしょうか？

初学者でローカル変数という用語に混乱しています。①、②どちらが正しいのでしょうか？ それともこれ以外の範囲に該当するのですか？
この書籍に書かれているローカル変数という用語が出てきた場合、その範囲について初心者でもわかるように解説してください。  
宜しくお願い致します。

＜参考書籍＞

×間違ったコード

* * *
[code]

    public function hello(){
    echo "こんにちは、{$name}さん！";
    }
    
[/code]

* * *

●$this-> プロパティ名  
上記のコードは間違っています。$nameではプロパティ $nameにアクセスできません。【$nameは同名のローカル変数を探すため】値はnullです。  
プロパティ $nameにアクセスするには、インスタンス自身を指し示す$thisを使って「$this->name」のように記述しなくてはなりません。

〇正しいコード

* * *
[code]

    public function hello(){
    echo "こんにちは、{$this->name}さん！";
    }
    
[/code]

* * *

* * *

＜記述＞

[code]

    <?php
    class OurList{
    public $name;
    public $age;
    
    public function hello(){
    echo "こんにちは、{$this->name}さん！";
    
    }
    public function age(){
    echo "{$this->name}さんは今年{$this->age}歳です。";
    }
    }
    ?>
    
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset ="utf-8">
    <title>クラス名簿</title>
    </head>
    <body>
    <pre>
    <?php
    $rika = new OurList();
    $taichi = new OurList();
    
    $rika->name = "里佳子";
    $rika->age = 21;
    
    $taichi ->name = "泰一朗";
    $taichi ->age = 19;
    
    
    print_r($rika);
    print_r($taichi);
    
    $rika->hello();
    echo "<br>";
    $taichi->hello();
    echo "<br>";
    echo "<br>";
    
    $rika->age();
    echo "<br>";
    $taichi->age();
    ?>
    </pre>
    </body>
    </html>
    
[/code]

* * *

＜表示結果＞

[code]

    OurList Object
    (
    [name] => 里佳子
    [age] => 21
    )
    OurList Object
    (
    [name] => 泰一朗
    [age] => 19
    )
    こんにちは、里佳子さん！
    こんにちは、泰一朗さん！
    
    里佳子さんは今年21歳です。
    泰一朗さんは今年19歳です。
    
[/code]


CC BY-SA 4.0
2021-04-19T07:33:17.697
75377
2021-04-23T05:29:20.077
2021-04-20T01:23:48.530
3060
42150
question
php
PHP でインスタンス自身を示す $this について


回答は

> ①hello()以下の{}で囲まれたスコープの範囲内

「ローカル」とは特定の[変数のスコープ](https://www.php.net/manual/ja/language.variables.scope.php)の範囲を示し、  
「ローカル変数」といったら特定の変数のスコープの範囲の中にある変数を指します。

例えば以下のような関数があった場合、

[code]

    <?php
    $a = "Hello";             // A
    function HelloWorld($a) { // B
      $a = "World";           // C
      echo $a;                // D
    }
    HelloWorld($a);           // E
    
[/code]

  * Aの$aの変数と同列のスコープの$aはEになります。
  * Bの$aの変数と同列のスコープの$aはC,Dになります。

関数の中の変数はスコープが違うことがわかると思います。

混乱するのは「変数」と「クラスの[プロパティ](https://www.php.net/manual/ja/language.oop5.properties.php)」を同列に扱ってしまっているからだと思います。  
よく似た書き方をしますが性質は全く異なるものです。  
それぞれ違いものという認識をもっていくとよいでしょう。


CC BY-SA 4.0
2021-04-20T01:09:19.843
75392
2021-04-20T01:23:17.270
2021-04-20T01:23:17.270
3060
22665
75377
answer


まず、

[code]

    class OurList {
        public $name;
        public $age;
        ：
        ：
    }
    
[/code]

として、メンバ変数「$name」が定義されていますが、クラスの中で、この変数にアクセス（値を参照したり、代入したりする）には「 **$this-
>name**」と書く必要があります。 **$this はクラス自身** を指しています。

そのため、関数の中で $this->name の値を使いたいのであれば、

[code]

    public function hello() {
        echo "こんにちは、{$name}さん！";
    }
    
[/code]

のように「 **$name** 」と書いてしまうのは間違い、ということです。

前述のメンバ変数にも $name があるので、少し分かりにくいと思いますが（まぁ、そこを狙った問題なんでしょうけど）、この **関数の中の $name
は、関数の中でしか使用できません** 。また、 **関数の中の $name は、ここで初めて登場している（まだ値が代入されていない）ため null
である** 、ということです。

変数がどこで使用できるのかは、 **スコープ** によって決まります。スコープについては、すでにほかの方が回答されていますので割愛しますが、
**すべてのスコープで使えるグローバル変数** に対して、 **限られたスコープでのみ使えるのがローカル変数** です。  
（$this->name も、スコープはクラスの中にしかありませんので、これもローカル変数です）

ということで、ご質問の「この場合「ローカル変数」の「ローカル」とは①ということでしょうか？②という意味でしょうか？」への **回答としては、①
ということになります** ね。

分かりにくかったらすみません！


CC BY-SA 4.0
2021-04-23T05:29:20.077
75467
2021-04-23T05:29:20.077
44343
75377
answer