[Codeigniter-users] 奇妙な点 (Re: CIの速度) (Re: 初めまして)

Back to archive index

Kenji kenji****@club*****
2008年 8月 13日 (水) 11:31:35 JST


Kenji です。


On Wed, 13 Aug 2008 11:12:02 +0900
mocap****@pugpu***** wrote:

> kunitsujiさん
> 
> On Tue, 12 Aug 2008 12:17:42 +0900
> kunitsuji <tsuji****@m-s*****> wrote:
> 
> >  kunitsujiです。
> > 
> > もかぱぱさん。こんにちは。
> 
> お返事が遅れてすみません。
> 
> > 下記みましたが、あくまでもPHPのバージョンその他基本的に全く同じ状態で
> > なおかつCIのソース、設定情報も同じということですよね?
> > 唯一違うのが
> > >A(社内): allow_call_time_pass_reference = Off
> > >B(公開): allow_call_time_pass_reference = On
> > ということでまちがいないですか?
> 
> 他にも微妙に違っていたのですが、これが目につきました。

http://www.php.net/manual/ja/ini.core.php#ini.allow-call-time-pass-reference

|推奨される方法は、関数宣言時に参照渡しとするべき引数を指定する ことです。
|将来のバージョンでの動作を保障するために、この オプションを off とし、
|スクリプトがこの状態で正しく動作することを 確認することが推奨されます 
|(この機能を使用する度に警告が発生します)。

これは、Off に設定すべき項目ですね。また、警告するだけのようですから、
動作には影響しないはずです。


> > // 擬似変数の設定
> > >    $this->_set_pseudo_variables(&$data);
> > ここで引数が参照私になっていますよね?
> > これ普通に渡してみてどうですか?それでも
> > appli中の$this->parserはちがいがでますかね。
> 
> このメソッド中で、parserに渡すデータを設定しているので、値渡しにしてしま
> うとデータが返りません。実際に擬似変数に値が入らなくなります。

ということで、上記は、よくないコードですね。


> >  PHPのバージョンは5ですよね?
> 
> すみません、phpのバージョンを書き忘れていました。
> 
> A(社内): PHP 5.2.6
> B(公開): PHP 4.3.10-22
> 
> と大分違いました。

> ところで、調べていたら以下のことがわかりました。オリジナルの
> 
>     $this->load->library('framework');
>     $this->load->library('parser');
> 
> この順を入れ替えたら動作しました。また、
> 
>     $this->load->library('framework');
>     $this->load->library('parser');
>         :
>     $this->framework->parser->parse($view, $data);
> 
> としたら動作しました。どうも
> 
>     $this->load->library('framework');
> 
> この処理の後の名前空間に問題があるようです。つまり、$thisはこのアプリケー
> ションのクラスでなくてはならないのにframeworkを指しているようです。なの
> で、ロード順を入れ替えてparserを先にロードすると本来の
> 
>    $this->parser->parse($view, $data);
> 
> は動作するし、元の順のまま、
> 
>    $CI = &get_instance();
>    $CI->parser->parse($view, $data);
> 
> は、$CIがframeworkになるため動作するようです。Frameworkクラスは
> 
> class Framework extends Controller {
> 
> と定義しているのですが、まずいでしょうか?

原因は、それですね。

Framework がコントローラですと、$this は CodeIgniterスーパーオブジェクトに
なるかと思います。

ライブラリなら、Controllerクラスを継承してはいけないですね。


// Kenji




Codeigniter-users メーリングリストの案内
Back to archive index