• 締切済み

PHPでrailsのbefore_filterを再現したいのですが

初めまして。当方PHP初心者です。 標題の通り、PHPでrailsのbefore_filterのような機能を再現できないでしょうか。 要するにクラス内にAメソッド、Bメソッド、Cメソッド、Dメソッドが存在していて、 Bメソッド、Cメソッド、Dメソッドを実行する前に必ずAメソッドを実行させたいのです。 実現できる関数を探してみたのですが、どうにも見つかりませんでした。 皆様のお知恵を拝借したいです。 どうぞ、よろしくお願いします。

みんなの回答

回答No.1

Ruby On Railsは、Ruby言語で開発されたWebアプリケーションフレームワークですので、 素のRubyで存在しているパターンというわけではないんじゃないでしょうか。 PHPでもまた、素のPHPで実現できるものではなく、フレームワークに機能として含まれている場合がある(ソレもアクセス手段を限定的にした場合に動作する)、程度のものだと思います。 PHPはRubyほど柔軟な言語ではないので、ソレを標準的にどこでも利用できるようにするとしたら、PHPの言語自体のソース(C言語作られた元のソース)を紐解いて修正するなり、Extensionを作成する(やっぱりC言語)しかないと思います。 ただ、意図する動作に「近いもの」を実現する方法としてはいくつかあります。下記はその一例です。 <?php class Test{ protected $before_filter = 'A'; protected function A(){ echo "hoge"; } protected function _B(){ } protected function _C(){ } protected function _D(){ } public function __call($name, $param){ $name = "_{$name}"; if(method_exists($this, $name)){ if(is_callable(array($this, $this->before_filter))){ call_user_func(array($this, $this->before_filter)); } return call_user_func_array(array($this, $name), $param); } return null; } } $test = new Test(); $test->B(); $test->C(); $test->D(); ?> このようにすれば近い動作はします。 これは、 必要なメソッド名の前に「_(アンダースコア)」をつけたものを作成し、外側の呼び出しでは「$test->C()」というように「_」をはずして呼び出します。 当然存在しないメソッドを呼び出していますので、通常エラーになってしまいますが、PHPのオーバーロードの、マジックメソッドである「__call」にて、存在していないメソッド名と引数に指定されたものを取得します。 そして、取得したメソッド名に「_」を付加し、メンバ変数$before_filterで指定したメソッドをcall_user_func関数で呼び出した後に、call_user_func_array関数にて、それぞれ動的にメソッドを呼び出しています。 マジックメソッドや、call_user_func関数などに関しては、PHPマニュアルや、その他解説サイトなどで詳しく説明されています。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • PHPの関数をC#で再現したい

    このジャンルでお願いします。 C# 2010 version 4.0を使用しています。 PHPという言語で isset( mixed $var [, mixed $... ] ) ・・・ 変数がセットされており、それが NULL でないことを調べる と array_key_exists ( mixed $key , array $search ) ・・・ 指定した key が配列に設定されている場合、 TRUE を返す という2つの関数がありますが、それぞれC#で同じような機能を再現しようとした場合に、 どのような記述やメソッドを使えば良いのでしょうか? 自分としては、C#のListを使って試しているのですが、 Listのメソッドにそれらしきものがなくて、 Countプロパティで指定したインデックス以下だったらと存在しない という無理なやり方しか思いきません・・・ if (list.Count <= indexKey) { /*存在しない*/ } 上の2つの機能をなんとかして再現することはできないでしょうか?

  • PHPから別なPHPへ移動(?)する方法

    実現する命令ごとにPHPのファイルを分けて作りました。 A.phpで画面表示して命令によりファイ路を操作するB.php,C.phpを実行。 処理完了後にA.phpに戻るようにしようと思っています。 しかし、B.phpとC.phpからA.phpを表示させる(戻る)方法がわからずにいます。 echo fopen('A.php','r'); でいけるかな?と思っていましたがうまくいきませんでした。 よろしくお願いします。

    • 締切済み
    • PHP
  • PHPの配列について

    PHPの配列についての質問です。 以下のソースを // == ソース == function hoge( $foo ) { $arrs['a'] = 'A'. $foo; $arrs['b'] = 'B'. $foo; $arrs['c'] = 'C'. $foo; $arrs['d'] = 'D'. $foo; } hoge( '3' ); hoge( '9' ); // == /ソース == 実行すると print_rは // == print_r == Array (   [a] => A3   [b] => B3   [c] => C3   [d] => D3 ) Array (   [a] => A9   [b] => B9   [c] => C9   [d] => D9 ) // == /print_r == のようになります。 これを 関数を実行するごとに (0から IDのような 配列を組むようにする) 以下のようにするには どのようにすればよいでしょうか? // == print_r == Array (   [0] => Array     (       [a] => A3       [b] => B3       [c] => C3       [d] => D3     )   [1] => Array     (       [a] => A9       [b] => B9       [c] => C9       [d] => D9     ) ) // == /print_r == 使用目的は get_contentsしたものを正規表現で取り出し 配列にする処理に使おうと思っています。

    • ベストアンサー
    • PHP
  • phpのクラスについて

    phpで会員制サイトの制作を勉強しています。 データベースへはPDOで接続しています。 MySQLデータベースを使用しています。 現在、クラスを作成してみようとオブジェクト指向について学習しています。 試しに、既に作ってあった、POSTされた文字列をhtmlspecialcharsやfilter_inputするようなセキュリティやNoticeエラー対策に使うプログラム関数を class Checkのメソッドとしてまとめようとしています。 関数にしていたときは正常に動いたのですが、 クラスのメソッドにするとFatal error: Cannot use object of type Check as array in ~というエラーが出てしまいます。 恐らく、引数の受け渡し($_POSTの値の受け渡し)の時点でうまくいっていないのか、 私的には、メソッド結果の受け取りがあまり理解できていないので、 メソッド結果の値を配列で返すのがうまくいっていないのだと思います。 <関数> function postFilter($before) { foreach($before as $key=>$value) { $after[$key] = filter_input(INPUT_POST, $key); } return @$after; } *呼び出し* $post = postFilter($_POST); $email = $post["email "]; <クラス> class Check { public function エスケープ処理 { エスケープ処理のメソッド } //POSTで受け取ったものをfilter_inputでフィルタリング public function filterPost($before){ foreach($before as $key=>$value) { $after[$key] = filter_input(INPUT_POST, $key); } return $after; }    ・    ・    ・ } *呼び出し* $post = new Check(); $post -> filterPost($_POST); $email = $post ["email "]; そもそもクラス化する必要がない気がして、関数のままにしておこうかと思ったのですが、 オブジェクト指向はどのプログラムを学ぶにあたっても、重要だと思い、 わからないまま放置したくないので質問しました。 添削いただけませんでしょうか? よろしくお願いします。

    • ベストアンサー
    • PHP
  • JavaScriptとphpでできますか?

    お世話になります。 ずーっと考えているのですが、実現方法及び、実現できるのかどうか、 で悩んでいます。 アドバイスをお願いいたします。 Aさんが、あるサイトのボタンクリックすると、Bさんの待ち受け画面htmlにつながります。 (ここまでは某APIにて実現しています(電話)) その際に、追加でAさんのURLをBさんのサイトに表示させたいのです。 方法として、Aさんがボタンクリックしたときに、JavaScriptでURLを取得し、 POSTデータにして、ajax通信でBさんのサイトにあるphpを実行。 でも、phpでURLデータは取得できるとして、その後、どうやってBさんのhtmlに出力させるの(既にhtmlは表示されているし)? Bさんhtmlの中の表示させたい<div>などに <?php echo "{$url}"; ?>などできる? もし出来たとして、その場合、Aさんは(ソースコードレベルで)どうやってBさんにデータを渡すの? phpを実行させるの? phpの名前は? Aさん、Bさんのhtmlは同一Webサーバーです。 Bさんのhtmlは最初から表示されています。 考えても、考えても 出来そうで出来ない。。。 こんなことは出来ないのでしょうか? どなたかアドバイスをお願いいたします。

    • ベストアンサー
    • PHP
  • Filter関数を用いた結果、何も検索されなかった場合

    Filter関数を用いた結果、何も検索されなかった場合 以下のプログラムを実行したところ、セルはまっさらのまま。   Sub Macro3()     Dim a As Variant     a = Array(1, 2, 3, 4, 5)     ActiveCell.Value = Filter(a, 8)   End Sub そこで   If Filter(A,8) = "" Then ・・・(1)     ActiveCell.Offset(1, 0).value = False   Else表示     ActiveCell.Offset(1, 0).value = True   endif を書き加えてみましたところ、   実行時エラー'13':   型が一致しません とのエラーが出ます。 (1)を   If ActiveCell.value = "" Then と書く分には問題ないのですが、だからと言って、Filter(A,8)の値は""で表せないのですね。 とりあえずこの五行はエラーが出ているので削除しました。 次に   ActiveCell.Offset(1, 0).Value = IsEmpty(Filter(A, 8)) を書き加えると、アクティブセルの一つ下は「False」となります。Filter(A,8)では何も抽出されないのですから、空か否かを問われたら「True」のはずなのですが・・・やはり何か戻り値があるのですね・・・ ではエラー値が戻っているのかと   ActiveCell.Offset(2, 0).Value = IsError(Filter(A, 8)) を書き加えると、「False」ですからエラー値ではありません。   If Filter(A,8) = Null Then ・・・(2)     ActiveCell.Offset(3, 0).value = False   Else表示     ActiveCell.Offset(3, 0).value = True   endif を書き加えたところ、またも   実行時エラー'13':   型が一致しません とのエラーが出ます。 (2)を   If Filter(A,8) = Error Then と書き換えてみても同じです。 試しに(2)を   If Cvar(Filter(A,8)) = Null Then としてみたり   If Filter(A,8) = Cvar(Null) Then としてみたり   If Cvar(Filter(A,8)) = Cvar(Null) Then としてみたりしましたが、同じエラーが出ます。 Ubound(Filter(A,8)の値は-1です。これをもってこの場合の戻り値とするしかないのでしょうか。filter関数の戻り値が分からないからUbound関数を使っていることがモロばれで、嫌なんです。   If Filter(A,8) = なんとか Then のなんとかに入る戻り値をどなたか教えてください。

  • PHP System関数が動作しません

    サーバー上の、あるphpファイル(sample_c.php)をシステム関数を使用して実行する必要があり、以下の流れのプログラムを作成しました。 sample_a.php でSubmit sample_b.php でSystem関数でsample_c.phpを呼び出し sample_c.php で実行 です。 <? /* sample_a.php */ ?> <form action="sample_b.php" method="post"> <input type="hidden" name="login" value="sample_user"> <input type="hidden" name="action" value="trigger_b"> <input type="submit" value="submit"> </form> <? /* sample_a.php */ ?> <? if($_POST['action'] =="trigger_b") { $login = $_POST['login']; system("sample_c.php $login"); header('Location: sample_a.php?action=fin'); exit; } else { header('Location: sample_a.php?action=error'); exit; } ?> <? /* sample_c.php */ ?> $_SERVER['argv'] で受け取った値を処理 ----------------- 3つのファイルは全て同じ階層に配置してあります。 sample_a.phpでsubmitすると、sample_a.php?action=fin にリダイレクトするのですが、 sample_c.php内の動作が実行されていません。 中身はDB接続して、テーブルに保存する単純なsql文が入っていて、sample_c.php単体での動作は確認しています。 (単体テストの場合は$_SERVER['argv']の代わりに変数に値をセットして実行しています。) System関数で変数を受け渡さずに system("sample_c.php $login"); を system("sample_c.php") として実行してもうまくいきません。; 原因が分かるかたがいらっしゃれば教えてください。 お願いします。

    • ベストアンサー
    • PHP
  • phpで$a,$b,を%指定して表示させたい

    php で $a, $b, $c... をそれぞれして指定したパーセントの割合で表示させるプログラムを教えて下さい $a = 'hoge'; $b = 'huga'; $c = 'piyo'; $a は 10%, $b は 30%, $c は 60% といった具合に指定できつつ $d, $e... と続いても パーセント指定していけるような関数を作りたいです ご回答よろしくお願いしますm(__)m

    • ベストアンサー
    • PHP
  • PHP5における四捨五入について

    PHP5でラウンド関数を使用しても境界値の5の値を切り捨ててしまい,四捨五入が上手くできません。 具体的には,以下の感じです。 $C = ROUND($B / $A,2) "C=282.25" $D = ROUND($C,1) "D=282.2" ※データ型は特に定義していません。 どのようにしたら四捨五入が上手くできるか教えて頂けないでしょうか。よろしくお願いします。

  • PHPからのライブラリ関数コール

    あちこち検索したのですが、うまくヒットしません。 Linuxにて作成したC言語のダイナミックリンクライブラリ(xxxxx.so)の関数をPHPから実行することは可能でしょうか。実現可能であれば、PHP側ではどのような手順が必要ですか。よろしくお願いします。

    • ベストアンサー
    • PHP