私は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
間違った方法でプロパティにアクセスします。 $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にアクセスすることです
まず、varを使用して変数を宣言しませんが、
public $my_value;
その後、次を使用してアクセスできます
$this->my_value;
ではなく
$this->$my_value;
クラスの変数にアクセスするには、$this->myVar
の代わりに$this->$myvar
を使用する必要があります。
また、var
の代わりにアクセス識別子を使用して変数を宣言する必要があります。
ドキュメントをお読みください こちら 。
あなたのコードにあるように、PHP4に基づくOOPのPHPに関する古いドキュメント/チュートリアルに従っているようです(OOPはサポートされていませんでしたが、簡単な方法)、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;
}
?>
私はそれが役立つことを願っています
面白い:
var $my_value = array();
を宣言しました$a->my_value[] = 'b';
$a->set_value ('c');
$a->my_class('d');
そして、foreach
は機能しなくなります。
これにより、カスタムプロパティ名で新しいオブジェクトを作成できます。
$my_property = 'foo';
$value = 'bar';
$a = (object) array($my_property => $value);
次のようにアクセスできます。
echo $a->foo; //returns bar
この回答は、OPで記述された問題に対する直接的な応答ではないことを理解していますが、同じエラーメッセージを検索した結果、この質問を見つけました。誰かが同じことをいじっている場合に備えて、ここに私の経験を投稿する価値があると思いました...
連想配列のfor
ループのフォーマットが不適切なため、問題のエラーが発生する可能性があります。骨が折れているので、for
ステートメントで=>ではなく->を使用していました。
foreach ($object->someArray as $key->$val) {
// do something
}
もちろん、私は持っている必要がありました:
foreach ($object->someArray as $key=>$val) {
// do something
}
報告されたエラーはsomeArrayプロパティを参照していると考えて、最初は混乱していました!