1

これをしている間、私は疑問に思いました:

class Logger {
        public static $log_INFO = 'INFO';
        public static $log_ERROR = 'ERROR';
        public function log($logLevel, $param2, $param3) {
              // Write log to some file
        }
}

class Midea {
       public function fn1 {
           $logger = new Logger();
           $logger->log(Logger::$log_INFO, 'some', 'some2');
       }
}

今私の質問は次のとおりです: Logger クラスのログ関数を作成して、Logger クラスの静的変数 (任意の静的変数) のみを受け入れる方法はありますか? 他の文字列や整数を引数として受け入れてはなりません。

4

3 に答える 3

3

私の答えは、 $logLevel に静的クラス プロパティの名前が含まれているという事実に基づいていました。

これを更新された例の Logger::$INFO として使用すると、値string(4) "INFO"が渡され、これは機能しません。値string(8) "log_INFO"を渡す必要があります

はい、リフレクションを使用して:

public function log($logLevel, $param2, $param3) {
    $reflection_property = new ReflectionProperty(get_called_class(), $logLevel);
    if($reflection_property->isStatic()) {
        // rest of the code
    }
}

IMO この種の強制は不要です。コードに複雑さとオーバーヘッドの両方が追加されます。しかもメリットは小さい。

この縫い目のようなあなたの必要性をコーディングすることは、私にとってより適切です:

public static function $log_levels = array('INFO', 'ERROR');
public function log($log_level, $param2, $param3) {
    if(in_array($log_level, static::$log_levels)) {
        // code
    }
}

上記の構造は、素晴らしい機会を開きます。

public static function $log_levels = array(
    'INFO' => array('Logger', 'handleInfoLogs'),
    'ERROR' => array('Logger', 'handleErrorLogs')
);
public function log($log_level, $param2, $param3) {
    if(array_key_exists($log_level, static::$log_levels)) {
        return(static::$log_levels[$log_level]($param2, $param3));
    }
}
于 2012-05-21T07:13:04.990 に答える
1

それはかなり面倒ですが、あなたはこれを行うことができます:

abstract class LoggerStatus
{
    public function __toString()
    {
        return $this->status;
    }
}

class LoggerStatusInfo extends LoggerStatus
{
    protected $status = 'INFO';
}

class LoggerStatusError extends LoggerStatus
{
    protected $status = 'ERROR';
}

class Logger {
    public static $log_INFO;
    public static $log_ERROR;

    public function __construct()
    {
        self::$log_INFO = new LoggerStatusInfo();
        self::$log_ERROR = new LoggerStatusError();
    }

    public function log(LoggerStatus $logLevel, $param2, $param3) {
          // Write log to some file
    }
}

私はこれを自分で試したことがありませんが、うまくいかない理由はわかりません。個人的にはもっと簡単なものを選びます。

于 2012-05-21T07:31:25.850 に答える
1

あなたが求めているのは、Java の世界の列挙型に似ています。PHPで同様の概念を実装する方法に関する情報が含まれているSOに関するこの質問を確認してください。

より具体的には、次のように求めているものを実装できます。

class Logger {
    const INFO = 1;
    const ERROR = 2;
};

次に、次のようなコードで使用できます。

Logger::INFO

完璧ではありませんが、PHP で得られるものと同じくらい近いと思います。それを防弾にするために、渡された引数をチェックするために何らかのリフレクションを採用する必要があります.SOに関するこの回答には、それを実装する方法に関する詳細情報があります。

于 2012-05-21T07:11:41.230 に答える