
A 回答 (1件)
- 最新から表示
- 回答順に表示
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が見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ラッパークラスって何ですか?
-
静的プロパティと静的メソッド...
-
「クラス関数」「メンバ関数」...
-
phpのクラスメソッドの定義が長...
-
Re: Cookieを使ってオブジェク...
-
Subversionのリポジトリの削除
-
FTPコマンドでディレクトリごと...
-
拡張子php画像をjpg画像等に変...
-
.htaccessにphp_valueが使用できな
-
inputタグでphpを呼び出す際、...
-
CFileDialogの最初のディレクト...
-
GD(php)での image関数 イメ...
-
PHPのif文でその処理を途中で抜...
-
「クラウドにアップロード」」...
-
ftpでアップロードが出来ない
-
Oracleに接続できません
-
php.ini を設定を変更すると再...
-
「localhostの応答を待っていま...
-
全角ファイル名をアップロード...
-
Subversionで、ファイルをリネ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「クラス関数」「メンバ関数」...
-
ラッパークラスって何ですか?
-
考えてみれば、ポリモーフィズ...
-
※staticと$thisの違いは何ですか
-
$thisとコンストラクタについて
-
プラグインについて
-
OOPの実践の入門に良いサイトは...
-
インタフェースとは
-
PHPによるHTMLの解析
-
静的プロパティと静的メソッド...
-
phpのクラスメソッドの定義が長...
-
PHP4、PHP5 1ファイル複数クラ...
-
クラスについて
-
phpでクライアントのブラウザの...
-
Re: Cookieを使ってオブジェク...
-
Codeigniter コアクラスの継承
-
非オブジェクト指向で開発中の...
-
PHP,privateの使用理由について
-
オブジェクト指向はなぜそんな...
-
クラス
おすすめ情報