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

@ मिचा, स्टनी --- पर मेरी टिप्पणी देखें (टिप्पणी हटा दी गई है) । मैं __construct() विधि की तलाश नहीं कर रहा हूं। यह केवल तब कहा जाता है जब ऑब्जेक्ट बनाया जाता है। मुझे एक जादू विधि की आवश्यकता है जिसे हर बार एक समारोह कहा जाता है। – w00

+1

नहीं, ऐसा नहीं है। अपनी मौजूदा विधियों को किसी अन्य योजना के साथ घोषित करें, या एक रैपर ऑब्जेक्ट का उपयोग करें। – mario

उत्तर

3

ऐसा करने का कोई सीधा तरीका नहीं है लेकिन यह मुझे आपके लागू करने की कोशिश करने की तरह दिखता है पहलू ओरिएंटेड प्रोग्रामिंग का रूप। वहाँ PHP में इसे प्राप्त करने के कई तरीके हैं, एक निम्नलिखित की तरह अपने वर्ग कुछ स्थापित करने के लिए किया जाएगा:

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 में AOP को लागू करने के लिए क्या आपके लिए सबसे अच्छा काम करता है देखने के लिए करने के अन्य तरीकों को फिर से देखें (मैं हूँ देखें कि मुझे कहीं एक लिंक मिल सकता है)।

संपादित करें: यहाँ एक दस्तावेज आप http://www.liacs.nl/assets/Bachelorscripties/07-MFAPouw.pdf

+0

फिर आप '__startMethod' और '_helloWorld' को निजी या संरक्षित के रूप में सेट कर सकते हैं, इसलिए कोई भी" हैक्स "नहीं करता है। – Soaku

2

इसके लिए कोई जादू विधि नहीं है। (: hidden_helloWorld जैसे), तो सभी__call के साथ कॉल को पकड़ने और hidden_ विधि कॉल करने के अगर यह उपलब्ध हो कोशिश

सबसे अच्छा तुम कर सकते हो अपने कार्यों के लिए अन्य नामों पैदा करते हैं। बेशक यह केवल तभी संभव है जब आपके पास कक्षा और उसके माता-पिता के नामकरण पर पूर्ण नियंत्रण हो ...

1

आप इसे अपने तरीकों निजी बनाने और __call() जादू विधि का उपयोग तरीकों को फोन करके प्राप्त कर सकते थे के लिए है। पसंद:

<?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

बहुत अच्छा विचार! –

संबंधित मुद्दे