プロが教える店舗&オフィスのセキュリティ対策術

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

A 回答 (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-feature …
    • good
    • 0
この回答へのお礼

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

お礼日時:2014/09/27 16:14

流れ的にはセットする関数を実行してからプリントするか



<?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();
?>
    • good
    • 0
この回答へのお礼

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

お礼日時:2014/09/25 19:31

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

この回答への補足

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

補足日時:2014/09/25 19:33
    • good
    • 0
この回答へのお礼

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

お礼日時:2014/09/27 16:18

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!