2012-04-25 13 views
0

私はこれであまり良くはありません。だから、これは愚かな質問です。変数変数を使用して静的変数にデータを挿入するときのエラー

私はクラスを持っている:

class debug { 
    private static $messages = array(); 
    private static $errors = array(); 
    private static $all = array(); // includes both of above 
    private static $types = array('messages','errors'); 
    public static function add($type, $message) { 
    if(!in_array($type,self::$types)) { 
     self::add('errors','Bad type "' . $type . '" specified when sending this message: ' . $message); 
     return false; 
    } 
    self::$$type[] = $message; // ERROR IS HERE (see below) 
    self::$all[] = $message; // no error 
    } 

} 

私はデバッグ(サプライズ)のために、別のクラスからこれを呼んでいます。 error.logファイルから

debug::add('error', 'Error in ' . __FILE__ . ' on line ' . __LINE__); 

PHPエラーメッセージ:

PHP致命的なエラー:[]の行に/var/www/lib/lib.phpに1248

を読み取ることが指す使用できません上記のデバッグクラスの行。

EDIT:

私は何をしようとしていることにデータを追加するために、静的などの配列を決定するために、変数の変数(したがって、投稿タイトル)を使用しています。

I.e. $ type == 'messages'ならば$$ type == $ messagesです。

は、だから私は自分が欲しい:: $$タイプ[] ==自己:: $メッセージ[]

場合や、$タイプ== 'エラー'、その後、$$タイプ== $エラーと自己:: $$ type [] == self :: $ errors []

+0

を試してみてください。 –

+0

あなたの場合、$ typesは配列です。インデックス$ types []は設定されていませんが、それを変数として使用しようとしています。もちろんそれは間違っています。達成しようとしていることを説明できますか? – shawndreck

+0

@tpaksu、良い点ですが、私のif(!in_array(...))がその問題を処理する必要があります。 –

答えて

2

次の行をに変更してください。これにより、最初に$typeが 'メッセージ'または 'エラー'として評価されます。

self::${$type}[] = $message; 

これを拡張すると、これは私が持っているコードです。あなたのコードに他の失敗の原因となっている構文エラーがあるようですが、これが$$type[]があなたにそのエラーを出す理由です。

class debug { 
    public static $messages = array(); 
    public static $errors = array(); 
    public static $all = array(); // includes both of above 
    private static $types = array('messages','errors'); 
    public static function add($type, $message) { 
     self::${$type}[] = $message; 
     self::$all[] = $text; 
    } 
} 

debug::add('messages', "Regular Message"); 
debug::add('errors', "Error Message"); 

print_r(debug::$messages); 
print_r(debug::$errors); 

そして、これは私がA. if(!in_array($type,self::$types)) {が正しく..あなたが最後

Bで}) instedを使用閉じていない

Array 
(
    [0] => Regular Message 
) 
Array 
(
    [0] => Error Message 
) 
+0

申し訳ありませんが、これは役に立ちません。 –

+0

働いていないものについて詳しく説明できますか?私はこれを現地で試しています。それは私のために働くようです。 –

+0

致命的なエラーが発生しています。私のif(!in_array($ type ...)テストはメソッド引数$ typeの不正な値をキャッチする必要があります。問題はself :: $$ type []の割り当てにあるようです(致命的なエラーについて言及します) –

2

2エラー

を取得し、出力されますself::$all[] = $text;$textスクリプトのどこにも定義されていません

にエラー配列を持っていますが、配列のエラーにそれを追加している

class Debug { 
    private static $errors = array(); 
    private static $types = array (
      'messages', 
      'errors' 
    ); 
    public static function add($type, $message) { 
     if (! in_array ($type, self::$types)) { 
      return false; 
     } 
     self::$errors [$type][] = $message; // results in error (see below) 
    } 

    public static function get($type = null) { 
     if (! in_array ($type, self::$types) && $type !== null) { 
      return false; 
     } 

     return ($type === null) ? self::$errors : self::$errors [$type] ; 
    } 
} 

debug::add ('errors', 'Error in ' . __FILE__ . ' on line ' . __LINE__); 
debug::add ('messages', 'Error in ' . __FILE__ . ' on line ' . __LINE__); 

var_dump(debug::get()); 
var_dump(debug::get("messages")); 
+0

指定されたエラーA.とB.は、指定したエラーとは何の関係もありませんでした。 A.はタイプミス(固定)に起因し、B.はポストに対するコード簡素化によるものです(固定)。とても読んでくれてありがとう。また、私はあなたのget関数とそのリターンロジックが好きです。非常に素晴らしい。しかし、もう1人のポスターが本当のエラーを見つけたので、私はあなたに+1を与えますが、私は彼に最高の答えを与えています。 –

+0

$メッセージを2回保存するのが効果的で効率的ではないと思った – Baba

関連する問題