2013-02-17 12 views
54

私はphpに新規で、以下のコードを実行しました。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 
+9

をあなただけ...いくつかのより多くの最新のチュートリアルを探し、 'var'および方法の使用をPHPを学習している場合クラスと同じ名前で、かなり古くて古いチュートリアルを示しています –

+0

@ MarkBakerあなたの指示に感謝します。 – Bishan

答えて

159

あなたは間違った方法でプロパティにアクセスします。 $this->$my_value = ..構文では、$ my_valueの値の名前でプロパティを設定します。何が欲しいのはあなたの例からいくつかのことを修正するために

$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')); 

良くaproachです。これは確実に、ということ$this->my_value = ..

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

ですmy_valueは、set_valueを呼び出すときに、その型を文字列に変更することはありません。しかし、それはまだ公開されているので、my_valueの値を直接設定することはできます。最後のステップは、my_valueをプライベートにし、getter/setterメソッドに対してmy_valueにのみアクセスすることです。

+0

その後、 'C:\ xampp \ htdocs \ MyTestPages \ f.php 12行目の文字列で致命的なエラー:[]演算子がサポートされていないというエラーが表示されます。 12行目は '$ this-> my_value [] = $ value;' – Bishan

+0

確かに.. set_value型をmy_valueからarray型に変更します。おそらく、あなたはset_valueのコードを '$ this-> my_value [] = $ value;' – Philipp

+0

に変更したいと思います。 – Bishan

9

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

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

hereの文書をお読みください。

+0

それから、 'C:\ xampp \ htdocs \ MyTestPages \ f.php 12行目の文字列で致命的なエラー:[]演算子がサポートされていないというエラーが表示されます。 12行目は '$ this-> my_value [] = $ value;' – Bishan

+0

'$ this-> my_value []'を呼び出すことはできません。 – Val

27

まず、VARを使用して変数を宣言しませんが、

public $my_value; 

次に、あなたは

$this->my_value; 

なく

$this->$my_value; 
1

興味深いを使用してアクセスすることができます

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

あなたのforeachはもう動作しません。

5

私はあなたのコードで見てきたように、PHP5の公式版以来、PHP4(OOPはサポートされていませんでしたが、何とか単純な方法で使用するように改造されました)サポートが追加され、表記法が変更されました。私はそれが私はこの答えはOPで説明した問題に直接応答ではありません実現

0

役に立てば幸い

<?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; 
} 

?> 

を、私はこの質問を見つけました:

ここでは、このコードのレビューを参照してください。同じエラーメッセージを検索した結果。誰かが同じことについて混乱している場合に備えて、ここに私の経験を掲載する価値があると思った...

連想配列上のループのフォーマットが不適切なためにエラーが発生することがあります。骨ふらつきのフィットでは、私が使用していた - 代わりに=>私のfor文での>:もちろん

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

、私が持っていたはずです。

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

を私は、最初に自分自身を混乱しました報告されたエラーがsomeArrayプロパティを参照していたと考えています!

1

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

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

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

echo $a->foo; //returns bar 
+0

はより詳細になりました..! – Chella

関連する問題