質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

FuelPHP

FuelPHPは、軽量高速で開発が可能なPHPのWebアプリケーションフレームワークです。

Q&A

解決済

3回答

5999閲覧

コントローラーの複数アクションメソッドで共通する処理を外出ししたらPHP 5.3でfatal error

退会済みユーザー

退会済みユーザー

総合スコア0

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

FuelPHP

FuelPHPは、軽量高速で開発が可能なPHPのWebアプリケーションフレームワークです。

1グッド

0クリップ

投稿2016/06/21 03:58

編集2016/06/21 04:02

###前提・実現したいこと
一旦動作確認を取ったFuelPHPで作った処理を、アクションメソッド内で行うフォーム作成やバリデーションまわりを共通処理としてアクションメソッドの外に出そうとしたところ、ハマってしまいました。
起因はPHP5.3系の問題らしいのですが、回避する方法を知りたいです。
分析用パラメータをフォーム送信にて受信し、集計結果をHTMLの表にするか、CSV出力するか、PDF出力するか、でアクションメソッドを分けていて、どれも分析用パラメータの項目は同じで受付可能な条件も同じなため、共通化しようとしました。

###発生している問題・エラーメッセージ

Fatal error: Cannot access self:: when no class scope is active in /home/XXXXXX/fuelphp/fuel/app/classes/controller/kobu.php on line 622

###該当のソースコード

PHP

1case '8': /* レディース */ 2 if ($p_include['brand']['8'][0] == '') 3 { 4 $err_flg = true; 5 Validation::active()->set_message('include_1', '絞込 レディースブランド指定が正しくありません。'); 6 return false; 7 } elseif ($p_include['brand']['8'][0] != 'all') 8 { 9 if (!array_key_exists($p_include['brand']['8'][0], self::$arr_brd_8)) //// <- ここが622行め 10 { 11 $err_flg = true; 12 Validation::active()->set_message('include_1', '絞込 レディースブランド指定が正しくありません。'); 13 return false; 14 } 15 } 16 break;

$arr_brd_8の宣言箇所は

PHP

1class Controller_Kobu extends Controller_Tmplcmn 2{ 3 static $arr_brd_1, $arr_brd_2, $arr_brd_3, $arr_brd_8, $arr_brd_9; 4 static $arr_ib;

###試したこと
$arr_brd_8らを、先に単にpublicとして、$this->arr_brd_8などとしてアクセスしていて、ローカルでは動作確認が取れました。
それをサーバーにアップロードしたら「Using $this when not in object context」っていうfatal errorになりました。
回避する方法を探して、static宣言にしたり、self::$arr_brd_8としてアクセスするように書き換えて、ローカルでは動作確認が取れましたが、サーバーでは「Cannot access self:: when no class scope is active」というfatal errorになりました。

###補足情報(言語/FW/ツール等のバージョンなど)
FuelPHP v1.7.2
ローカルテスト環境:PHP 5.4.16
サーバー実行環境:PHP 5.3.15
現状の経緯をブログに書いております:FuelPHPもPHP 5.4以降が必須なのかなぁ

KiyoshiMotoki👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

Fatal error: Cannot access self:: when no class scope is active

PHP5.3系だと、$thisが自動的にクロージャに束縛されないのが原因ぽいですね。
5.3も考慮するなら、コントローラ自身(もしくは設定値だけまとめて)をuseで明示的に
渡してあげればいけると思います。

php

1//プロパティのstaticを外して元に戻す 2 3$self = $this; 4return function () use ($self) { 5 $self->arr_brd_8; //使える 6}

クロージャ が $this をサポートするようになりました。

PHP 5.3.x から PHP 5.4.x への移行
http://php.net/manual/ja/migration54.new-features.php

php 5.4 リポジトリに舞い戻ってきたクロージャの $this サポート
http://d.hatena.ne.jp/do_aki/20110727/1311767728


Cannot access self:: when no class scope is active

こちらのエラーも5.3だと無名関数内のスコープでselfを解決できないのが原因だと
思うのですが、ソースは見つけられませんでした。
(クラス外でself::hogeと書いても同じエラーが出ます)

罠っぽい

php

1// 試行バージョン PHP5.6.13 2 3class Hoge 4{ 5 static $value = 'parent'; 6 7 public static function callSelf() 8 { 9 return self::$value; 10 } 11 12 public static function callStatic() 13 { 14 return static::$value; 15 } 16 17 public static function callClosureSelf() 18 { 19 return function () { 20 return self::$value; 21 }; 22 } 23} 24 25class HogeSub extends Hoge 26{ 27 static $value = 'sub'; 28} 29 30$closureSelf = HogeSub::callClosureSelf(); 31 32var_dump( 33 HogeSub::callSelf(), // parent 34 HogeSub::callStatic(), // sub 35 $closureSelf() // sub 36);

self:: の制限

self:: あるいは CLASS による現在のクラスへの静的参照は、 そのメソッドが属するクラス (つまり、 そのメソッドが定義されているクラス) に解決されます。

遅延静的束縛
http://php.net/manual/ja/language.oop5.late-static-bindings.php

投稿2016/06/21 08:21

編集2016/06/21 08:24
nnssn

総合スコア1221

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/06/21 08:28

あぁ、そっか。useで明示的に渡す方法がありましたね。書き方を示していただいてありがとうございます。
guest

0

ベストアンサー

"該当のソースコード"は、無名関数の中に記述されていませんか?
であれば、self::Controller_Kobu::に変更してみてはいかがでしょうか?

私もイマイチ理解していないのですが、無名関数のスコープは、単純に親クラスのそれを引き継いでいるわけではないようです。
http://php.net/manual/ja/functions.anonymous.php

投稿2016/06/21 04:17

編集2016/06/21 04:18
KiyoshiMotoki

総合スコア4791

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/06/21 06:25

ご指摘のとおり、無名関数の中に書いておりました。 バリデーションルールを定義する無名関数の中でした。 ご指摘のように書きなおしてみたところ、fatal errorがまるでウソだったように動いてくれています。ありがとうございます。
guest

0

回答ではありませんが、PHP開発ではサーバごとのPHPバージョンを「5.3」や「7.0」のように、最低限0.1までは揃えておきましょう。

PHPの場合、5.3と5.4で変化することがよくありますし、以前に5.3.3と5.3.14の違いにハマったことすらあります。

投稿2016/06/21 04:19

maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/06/21 04:21

ほんと、そうなんですよね。Windows版XAMPPを設定した時から既にバージョンがずれていたようでして。大丈夫だろうと思っていて、まさかこんなふうになるとは。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問