こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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

以下のソースで、配列変数$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();
?>

投稿日時 - 2014-09-22 20:57:17

QNo.8764326

困ってます

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

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

投稿日時 - 2014-09-22 22:43:38

補足

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

投稿日時 - 2014-09-25 19:33:09

お礼

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

投稿日時 - 2014-09-27 16:18:51

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

-広告-
-広告-

回答(3)

ANo.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

投稿日時 - 2014-09-27 02:36:11

お礼

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

投稿日時 - 2014-09-27 16:14:15

ANo.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();
?>

投稿日時 - 2014-09-22 22:56:13

お礼

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

投稿日時 - 2014-09-25 19:31:35

-広告-
-広告-
-広告-
-広告-