-8

背景情報:

共通の関数を子クラスから拡張元の基本クラスに移動することで、Yiiアプリの構造を単純化しようとしています。

loadModel($id)関数をユーザー(子)コントローラーからベースコントローラーに移動しました。

以前は、UserController.phpで。これは機能します:

public function loadModel($id) {
    $model = User::model()->findByPk($id);
    if ($model === null)
        throw new CHttpException(404, 'The requested page does not exist.');
    return $model;
}

その後、上記の関数を削除し、UserControllerなどに継承されているController.phpに配置しました。

public function loadModel($id) {
    $type = modelname(); // returns a string, i.e.: "User"
    $model = $type::model()->findByPk($id);
    if ($model === null)
        throw new CHttpException(404, 'The requested page does not exist.');
    return $model;
}

問題:

PHP 5.4.4を実行しているローカルPCでこれを試しましたが、これはPHP 5.2を実行しているテストサーバーにアップロードされると、HTTPエラー500(内部サーバーエラー)がスローされますエラーログを表示すると、エラーはエラーでした。これは、3行目の解決演算子PHP Parse error: syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIMを参照しています。

質問:

  • この場合、PHP 5.2で解決演算子が失敗する理由は何ですか?と、
  • これを同じ効果で機能させるための回避策はありますか?

=================

追加情報:

私が使用しているグローバルmodelname関数は、モデル名を返します。つまり、「User」:

function modelname() {
    return Yii::app()->controller->id;
}
4

2 に答える 2

1

私はここで答えを見つけました:

http://php.net/manual/en/language.oop5.paamayim-nekudotayim.php

スコープ解決演算子(Paamayim Nekudotayimとも呼ばれます)、または簡単に言うと、二重コロンは、クラスの静的、定数、およびオーバーライドされたプロパティまたはメソッドへのアクセスを可能にするトークンです。

クラス定義の外部からこれらの項目を参照する場合は、クラスの名前を使用してください。

PHP 5.3.0以降、変数を使用してクラスを参照することが可能です。変数の値をキーワードにすることはできません(たとえば、self、parent、static)。

基本的に、クラスを動的に参照できるようにするには、PHPバージョンをアップグレードする必要がありました。

于 2013-03-08T10:27:35.063 に答える
1

実際には、クラスを動的に参照するためにアップグレードする必要はありません。Yiiはそれなしでそれを行い、yiiはPHP5.2をサポートします。興味があれば、それがどのように行われるかを掘り下げることができるかどうかはわかりますが、同じ問題が発生し、PHP5.2で解決しました

編集:わかりました、ここに情報があります。元の情報をYiiwikiページに投稿しました。

Yiiシングルトンモデルを返すコードは次のとおりです。

    $thisModel = call_user_func($modelname, 'model');

しかし、DCoderによると、次のようCActiveRecord::model($modelname)にも機能するようです。

Yii情報はこちら:http ://www.yiiframework.com/doc/api/1.1/CActiveRecord#model-detail

于 2013-03-08T19:10:51.040 に答える