75323


長くなりましたが、ごく基本的な事かと思います。  
＜記述＞の部分です。  
クラス(OurList)を定義して、以下のようにインスタンスを作成しました。

[code]

    $okada = new OurList();
    $yamada = new OurList();
    
[/code]

ここで $okadaと $yamadaにそれぞれ $nameプロパティと $ageプロパティの値を設定する際の話です。

参考書の類やネット上にも出ていますがプロパティにアクセスする際の書式は  
[$インスタンス -> プロパティ名]  
となっています。ここで注意として、"$okada -> name"のように「プロパティ名には$(ダラーマーク)は付けない」と出てきます。

試しにインスタンス$yamadaにプロパティ名に$(ダラーマーク)をつけてみると以下のように当然のごとくエラーが出ました。

些細な事、ごく基本的な事かと思いますが、なぜプロパティ名から$(ダラーマーク)を付けないのか理屈で理解出来ません。

もう決まり事として丸暗記しておく類の事なのでしょうか？ なぜこういう形式になるのかピンときません。ど初心者なのでイチイチ気になります。

もしご存じの方いらっしゃいましたら解説してください。

＜出力結果＞

* * *

Notice: Undefined variable: name in C:\xampp(略).php on line 28

Notice: Undefined variable: age in C:\xampp(略).php on line 29

[code]

    OurList Object
    (
    [name] => 岡田隆
    [age] => 21
    )
    OurList Object
    (
    [name] =>
    [age] =>
    [] => 19
    )
    現在、在学中です
    現在、在学中です
    
[/code]

* * *

## ＜記述＞

[code]

    <?php
    class OurList{
    public $name;
    public $age;
    
    public function hello(){
    echo "現在、在学中です。";
    echo "<br>";
    }
    }
    ?>
    
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset ="utf-8">
    <title>クラス名簿</title>
    </head>
    <body>
    <pre>
    <?php
    $okada = new OurList();
    $yamada = new OurList();
    
    $okada->name = "岡田隆";
    $okada->age = 21;
    
    $yamada->$name = "山田和夫"; (//エラー行)
    $yamada->$age = 19; (//エラー行)
    
    print_r($okada);
    print_r($yamada);
    
    $okada->hello();
    $yamada->hello();
    
    ?>
    </pre>
    </body>
    </html>
    
[/code]

* * *


CC BY-SA 4.0
2021-04-16T06:48:39.600
75322
2023-08-06T02:01:23.907
2021-04-16T07:12:05.120
2238
42150
question
php
classのプロパティにアクセスする時


@keitaro_so さんがコメントされている可変変数によるものですが、 `$`
をつけるとその変数が展開された値をプロパティ名としてアクセスしようとするためです。

例えば

[code]

    $name = ‘unknown’;
    $yamada->$name = "山田和夫";
    
[/code]

このように記述すると `$name` の値が展開され

[code]

    $yamada->unknown = "山田和夫";
    
[/code]

実際にはこのような処理を行おうとします。

しかし、上述のコードでは `$name` は定義されていないので、恐らく `Undefined variable` などのエラーとなっているかと思います。


CC BY-SA 4.0
2021-04-16T07:02:47.743
75323
2021-04-16T07:02:47.743
784
75322
answer


説明の為にあえてエラーにならないように補完します。

[code]

    <?php
    
        class OurList {
            public $name ;
            public $age ;
    
            public $PROP_NAME ;
            public $PROP_AGE ;
    
            function __construct(){
                $this->PROP_NAME = '名前プロパティ' ;
                $this->PROP_AGE = '年齢プロパティ' ;
            }
    
            function hello(){
            }
        }
    
        $okada = new OurList();
        $yamada = new OurList();
    
        $name = 'PROP_NAME' ;
        $age  = 'PROP_AGE' ;
    
        $okada->name = "岡田隆";
        $okada->age = 21;
    
        $yamada->$name = "山田和夫";
        $yamada->$age = 19;
    
        print_r($okada);
        print_r($yamada);
    
        $okada->hello();
        $yamada->hello();
    
[/code]

実行結果

[code]

    OurList Object
    (
        [name] => 岡田隆
        [age] => 21
        [PROP_NAME] => 名前プロパティ
        [PROP_AGE] => 年齢プロパティ
    )
    OurList Object
    (
        [name] =>
        [age] =>
        [PROP_NAME] => 山田和夫
        [PROP_AGE] => 19
    )
    
[/code]

$name の場合はプロパティ名として 'name' ではなく、$name 変数の内容の PROP_NAME
の方が使用されるため、用途が違うので区別の為に変数を示す$が付いているのです。


CC BY-SA 4.0
2023-08-06T02:01:23.907
95866
2023-08-06T02:01:23.907
59393
75322
answer