2011-08-09 6 views
0

私はゲームマップのユーザー定義のリストを持っています。デザイン時に配列にマップがいくつあるのかわからないので、それらを含む新しい変数を動的に作成しようとしています。これも可能ですか?ここに私の失敗の試みです:PHP:このようなコードは可能ですか?

<?php 
$maplist=array("map1.aamap.xml","map2.aamap.xml"); //edit this list with your maps 
$rounds = 3;     //times to play each map 
/*======No need to edit below========*/ 
global $last; //store the last played map    
class Map 
{ 
    public $difficulty; 
    public $played; //amount of times played 
} 
foreach($maplist as $i => $element) 
{ 
    $element = $map[$i]; 
    $map[$i] = new Map(); 
} 
//snipped other code here 
$map[$i]->$played = $x++; //increment the times played counter <-- FAILS HERE 
?> 

は、パーサは言う:Fatal error: Cannot access empty property

は、このようにしても実現可能なこのようなものですか?

+1

'$ map [$ i] - > $ played = $ x ++;'の行がループしていないので、 '$ i'は存在しません。したがって、エラー – Kumar

+0

@Kumarはい。コードを編集して$ iを1に置き換えると、同じエラーが発生する – dukevin

+1

@Kumar:いいえ、 '$ i'はグローバルスコープで定義されているので、最後の配列要素のキーの値を保持したままループの後に存在します(この場合は「1」)。 –

答えて

2

あなたのコードにはエラーがあります:

<?php 
$maplist=array("map1.aamap.xml","map2.aamap.xml"); //edit this list with your maps 
$rounds = 3;     //times to play each map 
/*======No need to edit below========*/ 
global $last; //store the last played map    

あなたがここにグローバルスコープにあるので、関数の内部で、globalは必要ありません。

class Map 
{ 
    public $difficulty; 
    public $played; //amount of times played 
} 
foreach($maplist as $i => $element) 
{ 
    $element = $map[$i]; 

ここにいくつかのコードがありますか?ループ内で$elementを使用していないため、この割り当ては不要です。

$map[$i] = new Map(); 
} 
//snipped other code here 
$map[$i]->$played = $x++; //increment the times played counter <-- FAILS HERE 

メンバ変数にアクセスするための構文は$object->variable、ない$object->$variableです。後者は$variableと評価し、値を変数名として使用します(例:$variable = "foo"の場合は$object->fooにアクセスしようとします)。

代わりに$map[$i]->played = $x++;を使用してください。

+0

うわー。私は今、とても愚かな気分です! – dukevin

+0

私はあまりにも愚かだと感じますが、私は本当にグローバルレベルで定義された$ iを見ましたが、foreachが終了した後foreachの$ iは利用可能ですか?私はまだ愚かな気分です – Kumar

+0

@kumarクラブにようこそ;) – dukevin

2

クラスのプロパティにアクセスするときは、プロパティ名自体の前に$を使用しないでください。

$map[$i]->$played = $x++;$map[$i]->played = $x++;に置き換えてFatal error: Cannot access empty propertyエラーを解決してください。

+0

ええ、私はそれを実現しました。 * embarassed * – dukevin

0

あなたが希望する場合は、動的特性を提供するために魔法のメソッドをオーバーライドすることができます。これらの機能のそれぞれにおいて

public function __get($name) 
{ 
... 
} 

public function __set($name, $value) 
{ 
... 
} 

http://www.php.net/manual/en/language.oop5.overloading.php#language.oop5.overloading.members

をあなたには、いくつかの内部配列構造のデータを格納することができます。

0

インスタンスのプロパティにアクセスするときに$を使用する必要はありません。シンプルな使い方$ map [$ i] - >演奏。 OOP basicsをご覧ください。

関連する問題