1

以下は機能しません。

use application\components\auditor\AuditLevel;


public function actionAudit()
{
    $data=unserialize($_POST['data']);
    $message=$data['message'];
    $context=$data['context'];
    $level=$context['level'];
    Yii::app()->auditor->log(constant('AuditLevel::'.$level), $message, $context);
}

// constant(): Couldn't find constant AuditLevel::INFO

しかし、すべての名前空間を持つことは機能します:

use application\components\auditor\AuditLevel;


public function actionAudit()
{
    $data=unserialize($_POST['data']);
    $message=$data['message'];
    $context=$data['context'];
    $level=$context['level'];
    Yii::app()->auditor->log(constant('application\components\auditor\AuditLevel::'.$level), $message, $context);
}

関数の代わりに上記で宣言された名前空間を使用するにはどうすればよいですか?

ありがとう!

4

3 に答える 3

3

のphp.netコメントセクションからconstant()

PHP 5.4.6 以降、constant() は、それが使用されているファイルで定義されている可能性のある名前空間エイリアスに注意を払いません。つまり、constant() は常にグローバル名前空間から呼び出されたかのように動作します。

完全なネームスペース パスを使用する必要があります。

于 2014-01-06T15:11:57.747 に答える
2

文字列として渡されるすべてのクラス名は、現在の名前空間とエイリアスに対して「免疫」であり、常に完全修飾名です。変数によって新しいクラスをインスタンス化する場合でも、文字列名によって定数を解決する場合でも、常に FQN を使用する必要があります。これは実用的なことです。文字列はある名前空間から別の名前空間に渡すことができますが、明確な解決規則を作成することは不可能です。

于 2014-01-06T15:15:31.827 に答える
1

__NAMESPACE__キーワードを使用できます。

Yii::app()->auditor->log(constant(__NAMESPACE__ . '\AuditLevel::'.$level), $message, $context);

もちろん、これは同じ名前空間でのみ機能します。それ以外の場合は、フル パスを指定する必要があります [これは私には妥当に思えます]。

于 2014-01-06T15:12:03.853 に答える