• ベストアンサー

クラス内での二次元配列への値の代入について

以下のソースで、配列変数$a[0][0]にbを代入して、メソッドprintAでそれをprintしようとしていますが、"Parse error: syntax error, unexpected '$a' (T_VARIABLE), expecting function (T_FUNCTION) in C:\xampp\htdocs\a.php on line 4"というエラーが出ます。 どうすれば、$a[0][0]にbを代入して、メソッドprintAでそれをprintできるか教えてください。 phpのバージョンは5.5.15です。 <?php class A{ private $a = array(); $a[0][0] = 'b'; function printA(){ print $this->a[0][0]; } } $x = new A(); echo $x->printA(); ?>

質問者が選んだベストアンサー

  • ベストアンサー
noname#244856
noname#244856
回答No.1

>> $a[0][0] = 'b'; こういう静的ではない文はメソッドの中以外に書けません。あと、メソッドの中でprintして外側でもechoしているところが謎です。あと終了タグも要りません。以下のように書きましょう。 <?php class A{ private $a = array(array('b')); function printA(){ print $this->a[0][0]; } } $x = new A; $x->printA(); ちなみにPHP5.4以降で書くんだったらこうしますね。 <?php class A{ private $a = [['b']]; function printA(){ print $this->a[0][0]; } } (new A)->printA();

h_mp
質問者

お礼

補足のご回答ありがとうございました。

h_mp
質問者

補足

静的ではない文はメソッドの中以外書けないんですね。echoと終了タグが必要ない件も承知しました。ありがとうございます。 追加でご質問なのですが、静的でない文というのは、具体的にどういうものでしょうか。 よろしくお願いします。

その他の回答 (2)

noname#244856
noname#244856
回答No.3

以下のものは必ず右辺は静的な値でなければなりません。 ・クラスプロパティ宣言 (private, protected, public, var キーワード) ・クラス定数宣言 (constキーワード) ・定数宣言 (constキーワードを使う場合のみ、define関数による定義は除く) ・静的変数宣言 (staticキーワード) 静的な値の例を述べます。 ・null ・true ・1 ・'hoge' ・array() ・array(3 => 'hoge', 'five' => array('fuga')) 以下のような特徴があると思われます。 ・変数展開を使ってはいけない ・演算子を使ってはいけない ・関数を使ってはいけない (arrayキーワードは関数ではないので大丈夫) ・クラスのインスタンスを生成してはいけない ただ、PHP5.6からはこの制限が少し緩和されるようです。 http://php.net/manual/ja/migration56.new-features.php#migration56.new-features.const-scalar-exprs

h_mp
質問者

お礼

なるほど。静的でない文とはそういうもので、クラスプロパティ宣言ではそういった文以外書けないんですね。勉強になります。大変詳しくありがとうございます。

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

流れ的にはセットする関数を実行してからプリントするか <?php class A{ private $a = array(); function setA(){ $this->a[0][0] = 'b'; } function printA(){ print $this->a[0][0]; } } $x = new A(); $x->setA(); echo $x->printA(); ?> めんどうならコンストラクタで処理してみては? (汎用性が落ちるので微妙ですが・・・) <?php class A{ private $a = array(); function __construct(){ $this->setA(); } function setA(){ $this->a[0][0] = 'b'; } function printA(){ print $this->a[0][0]; } } $x = new A(); echo $x->printA(); ?>

h_mp
質問者

お礼

なるほど!メソッドで処理すればOKなんですね! 勉強になりました。ありがとうございます!

関連するQ&A