2012-04-06 7 views
5

オブジェクトから特定のメソッドが呼び出されたときに、マジックメソッドが最初に呼び出されるというマジックメソッドがありますか? __callメソッドのようなものですが、メソッドが見つからない場合にのみトリガされます。 既存のメソッドが呼び出されたときに(マジック)メソッドを実行する

は、だから私の場合、私はこのような何か希望:

class MyClass 
{ 
    public function __startMethod ($method, $args) 
    { 
     // a method just got called, so this is called first 
     echo ' [start] '; 
    } 

    public function helloWorld () 
    { 
     echo ' [Hello] '; 
    } 
} 

$obj = new MyClass(); 
$obj->helloWorld(); 

//Output: 
[start] [Hello] 

はこのようなものは、PHPに存在するかを?

+1

コードのこの部分が実行されるときに呼び出されるのは '__construct'だけです:' $ obj = new MyClass(); ' – noob

+0

@micha、Stonyのコメントを参照してください---(コメントは削除されました) 。私は__construct()メソッドを探していません。これは、オブジェクトの作成時にのみ呼び出されます。関数が呼び出されるたびに呼び出される魔法のメソッドが必要です。 – w00

+1

いいえ、ありません。既存のメソッドを別のスキームで宣言するか、またはラッパーオブジェクトを使用します。 – mario

答えて

3

これを行う直接的な方法はありませんが、アスペクト指向プログラミングの形式。私はよ(あなたのための最高の作品かを確認するためにPHPでAOPを実現するための他の方法を見上げて

class MyClass 
{ 
    public function __startMethod ($method, $args) 
    { 
     // a method just got called, so this is called first 
     echo ' [start] '; 
    } 

    public function _helloWorld () 
    { 
     echo ' [Hello] '; 
    } 

    public function __call($method, $args) 
    { 
     _startMethod($method, $args); 
     $actualMethod = '_'.$method; 
     call_user_func_array(array($this, $actualMethod), $args); 
    } 
} 

$obj = new MyClass(); 
$obj->helloWorld(); 

:PHPでこれを達成するためのいくつかの方法があり、一つは以下のようなあなたのクラスに何かを設定することです私はどこかのリンクを見つけることができます参照してください)。

編集:ここにあなたが

+0

'__startMethod'と' _helloWorld'をprivateまたはprotectedとして設定することができるので、誰もそれを "ハック"しません。 – Soaku

2

いいえこれのための魔法はありません。そして、:(hidden_helloWorldなど)__callすべて呼び出しをキャッチし、それが利用可能な場合hidden_メソッドを呼び出そう

あなたができる最善のは、あなたの機能のために他の名前を作成することです。もちろんこれは、クラスとその親などの名前を完全に制御できる場合にのみ可能です。

1

http://www.liacs.nl/assets/Bachelorscripties/07-MFAPouw.pdfあなたのメソッドがプライベート作り、__call()マジックメソッドを使用してメソッドを呼び出すことによって、それを達成する可能性があるため、ドキュメントがあります。 Like:

<?php 

class MyClass{ 
    function __call($methd, $args){ 
     if(method_exists($this, $mthd)){ 
      $this->$mthd($args); 
     } 
    } 

    private function mthdRequired($args){ 
     //do something or return something 
    } 

mthdRequiredメソッドは、呼び出しを使用する以外は呼び出されません。私はこれが有用であることを願っています。

+0

非常にクールなアイデア! –

関連する問題