64

私は初めてでphp、以下のコードを実行しました。

<?php
class my_class{

    var $my_value = array();
    function my_class ($value){
        $this->my_value[] = $value;
    }
    function set_value ($value){
    // Error occurred from here as Undefined variable: my_value
        $this->$my_value = $value;

    }

}

$a = new my_class ('a');
$a->my_value[] = 'b';
$a->set_value ('c');
$a->my_class('d');

foreach ($a->my_value as &$value) {
    echo $value;
}

?>

以下のエラーが発生しました。エラーは何でしょうか?

Notice: Undefined variable: my_value in C:\xampp\htdocs\MyTestPages\f.php on line 15

Fatal error: Cannot access empty property in C:\xampp\htdocs\MyTestPages\f.php on line 15
4

7 に答える 7

180

間違った方法でプロパティにアクセスします。構文を使用$this->$my_value = ..して、$my_valueの値の名前でプロパティを設定します。あなたが欲しいのは$this->my_value = ..

$var = "my_value";
$this->$var = "test";

と同じです

$this->my_value = "test";

あなたの例からいくつかのことを修正するために、以下のコードはより良いアプローチです

class my_class {

    public  $my_value = array();

    function __construct ($value) {
        $this->my_value[] = $value;
    }

    function set_value ($value) {
        if (!is_array($value)) {
            throw new Exception("Illegal argument");
        }

        $this->my_value = $value;
    }

    function add_value($value) {
        $this->my_value = $value;
    }
}

$a = new my_class ('a');
$a->my_value[] = 'b';
$a->add_value('c');
$a->set_value(array('d'));

これにより、set_valueを呼び出したときに、my_valueがタイプを文字列などに変更しないことが保証されます。ただし、my_valueの値はパブリックであるため、直接設定できます。最後のステップは、my_valueをプライベートにし、getter/setterメソッドを介してのみmy_valueにアクセスすることです。

于 2013-02-17T10:41:02.613 に答える
32

まず、varを使用して変数を宣言しないでください。

public $my_value;

次に、を使用してアクセスできます

$this->my_value;

ではなく

$this->$my_value;
于 2013-02-17T10:41:53.987 に答える
10

$this->myVarクラス内の変数にアクセスするには、の代わりにを使用する必要があります$this->$myvar

また、変数を宣言するには、の代わりにアクセス識別子を使用する必要がありますvar

こちらのドキュメントをお読みください。

于 2013-02-17T10:41:14.167 に答える
5

私があなたのコードで見るように、PHP5が公式サポートが追加され、表記が以前から変更されました。

こちらのコードレビューをご覧ください:

<?php
class my_class{

    public $my_value = array();

    function __construct( $value ) { // the constructor name is __construct instead of the class name
        $this->my_value[] = $value;
    }
    function set_value ($value){
    // Error occurred from here as Undefined variable: my_value
        $this->my_value = $value; // remove the $ sign
    }

}

$a = new my_class ('a');
$a->my_value[] = 'b';
$a->set_value ('c'); // your array variable here will be replaced by a simple string 
// $a->my_class('d'); // you can call this if you mean calling the contructor 


// at this stage you can't loop on the variable since it have been replaced by a simple string ('c')
foreach ($a->my_value as &$value) { // look for foreach samples to know how to use it well
    echo $value;
}

?>

お役に立てば幸いです

于 2013-02-17T10:51:19.137 に答える
1

面白い:

  1. 配列を宣言しました var $my_value = array();
  2. それに価値を押し込んだ $a->my_value[] = 'b';
  3. 変数に文字列を割り当てました。(したがって、これ以上の配列ではありません)$a->set_value ('c');
  4. 値を配列にプッシュしようとしましたが、それはもう存在しません。(文字列です)$a->my_class('d');

そして、あなたはforeachもう働きません。

于 2013-02-17T10:46:41.143 に答える
1

このようにして、カスタムプロパティ名を使用して新しいオブジェクトを作成できます。

$my_property = 'foo';
$value = 'bar';
$a = (object) array($my_property => $value);

今、あなたはそれに到達することができます:

echo $a->foo;  //returns bar
于 2015-10-30T10:41:37.193 に答える
0

この回答は、OPによって説明された問題に対する直接の応答ではないことを認識していますが、同じエラーメッセージを検索した結果、この質問を見つけました。誰かが同じことについて混乱している場合に備えて、ここに私の経験を投稿する価値があると思いました...

for連想配列上の不適切なフォーマットのループの結果として、問題のエラーが発生する可能性があります。骨の折れることで、私はforステートメントで=>の代わりに->を使用していました:

        foreach ($object->someArray as $key->$val) {
            // do something
        }

もちろん、私は持っていたはずです:

        foreach ($object->someArray as $key=>$val) {
            // do something
        }

報告されたエラーがsomeArrayプロパティを参照していると思って、最初は混乱しました。

于 2015-10-21T21:21:32.317 に答える