एक क्लास विधि के भीतर एक फ़ंक्शन कॉल करना?


108

मैं यह जानने की कोशिश कर रहा हूं कि ऐसा करने के बारे में कैसे जाना जा सकता है लेकिन मुझे यकीन नहीं है कि कैसे।

यहाँ एक उदाहरण है जो मैं करने की कोशिश कर रहा हूँ:

class test {
     public newTest(){
          function bigTest(){
               //Big Test Here
          }
          function smallTest(){
               //Small Test Here
          }
     }
     public scoreTest(){
          //Scoring code here;
     }
}

यहाँ वह हिस्सा है जिसकी मुझे समस्या है, मैं बिगटेस्ट () को कैसे कहूँ?


2
बस यह सुनिश्चित करने के लिए: एक फ़ंक्शन और एक विधि बिल्कुल समान फ़ंक्शन === विधि है। किसी वर्ग के कार्य का वर्णन करने के लिए OO भाषा में शब्द विधि का अधिक बार उपयोग किया जाता है।
मार्कस

कुछ शर्तों के गायब होने का कारण यह है कि मैं अपने कार्यालय से बाहर था, इसलिए मैं समय पर छोटा था।
WAC0020

जवाबों:


201

इसको आजमाओ:

class test {
     public function newTest(){
          $this->bigTest();
          $this->smallTest();
     }

     private function bigTest(){
          //Big Test Here
     }

     private function smallTest(){
          //Small Test Here
     }

     public function scoreTest(){
          //Scoring code here;
     }
}

$testObject = new test();

$testObject->newTest();

$testObject->scoreTest();

1
क्या function()क्लास फ़ंक्शन के अंदर किसी अन्य .php पृष्ठ से चलाना संभव है और फिर क्लास फ़ंक्शन के अंदर परिणाम पकड़ो? उदाहरण के लिए, मेरे पास एक क्वेरी है जो एक तालिका से सभी का चयन करती है और फिर सभी परिणाम सेट प्राप्त करता है। क्या कक्षाओं के कार्य के अंदर उस परिणाम के माध्यम से लूप करना संभव है? जैसेclass query{ public function show(){ getResults(); while($stmt->fetchCollumn()){ ECHO RESULTS HERE }
James111

22

आपके द्वारा प्रदान किया गया नमूना PHP मान्य नहीं है और इसमें कुछ समस्याएँ हैं:

public scoreTest() {
    ...
}

एक उचित फ़ंक्शन घोषणा नहीं है - आपको 'फ़ंक्शन' कीवर्ड के साथ फ़ंक्शन घोषित करने की आवश्यकता है।

वाक्यविन्यास बल्कि होना चाहिए:

public function scoreTest() {
    ...
}

दूसरा, बिगटेस्ट () और स्मॉलटेस्ट () फंक्शन को पब्लिक फंक्शन में लपेटना () {} उन्हें निजी नहीं बनाता है - आपको इन दोनों पर निजी कीवर्ड का उपयोग व्यक्तिगत रूप से करना चाहिए:

class test () {
    public function newTest(){
        $this->bigTest();
        $this->smallTest();
    }

    private function bigTest(){
        //Big Test Here
    }

    private function smallTest(){
           //Small Test Here
    }

    public function scoreTest(){
      //Scoring code here;
    }
}

इसके अलावा, यह वर्ग घोषणाओं ('टेस्ट') में वर्ग के नामों को भुनाने के लिए है।

उम्मीद है की वो मदद करदे।


11
class test {
    public newTest(){
        $this->bigTest();
        $this->smallTest();
    }

    private  function bigTest(){
        //Big Test Here
    }

    private function smallTest(){
       //Small Test Here
    }

    public scoreTest(){
      //Scoring code here;
    }
 }

10

मुझे लगता है कि आप कुछ इस तरह की खोज कर रहे हैं।

class test {

    private $str = NULL;

    public function newTest(){

        $this->str .= 'function "newTest" called, ';
        return $this;
    }
    public function bigTest(){

        return $this->str . ' function "bigTest" called,';
    }
    public function smallTest(){

        return $this->str . ' function "smallTest" called,';
    }
    public function scoreTest(){

        return $this->str . ' function "scoreTest" called,';
    }
}

$test = new test;

echo $test->newTest()->bigTest();

3

आपको newTestउस पद्धति के अंदर घोषित कार्यों को "दृश्यमान" ( कार्यों के भीतर कार्य देखें ) बनाने के लिए कॉल करने की आवश्यकता है । लेकिन यह तो सिर्फ सामान्य कार्य हैं और कोई विधियाँ नहीं हैं।


3

"किसी फ़ंक्शन के भीतर फ़ंक्शन" करने के लिए, अगर मैं समझता हूं कि आप क्या पूछ रहे हैं, तो आपको PHP 5.3 की आवश्यकता है, जहां आप नए क्लोजर सुविधा का लाभ ले सकते हैं।

तो तुम हो सकता है:

public function newTest() {
   $bigTest = function() {
        //Big Test Here
   }
}

3

किसी वर्ग से स्टेटमेंट की गई किसी भी विधि (स्टेटमेंट न्यू के साथ) को कॉल करने के लिए, आपको इसे "पॉइंट" करने की आवश्यकता है। बाहर से आप सिर्फ नए स्टेटमेंट द्वारा बनाए गए संसाधन का उपयोग करते हैं। नए द्वारा बनाए गए किसी भी ऑब्जेक्ट PHP के अंदर, इस चर में $ में एक ही संसाधन बचाता है। तो, एक वर्ग के अंदर आप इस $ द्वारा विधि की ओर इशारा करते हैं। अपनी कक्षा में, कक्षा के smallTestअंदर से कॉल करने के लिए , आपको PHP को बताना होगा कि आपके द्वारा निष्पादित किए जाने वाले नए कथन के द्वारा बनाई गई सभी वस्तुएं, बस लिखें:

$this->smallTest();

घातक त्रुटि: ऑब्जेक्ट संदर्भ में नहीं होने पर $ का उपयोग करना
स्टैनफोर्डली

2

उदाहरण 1

class TestClass{
public function __call($name,$arg){
call_user_func($name,$arg);
}
}
class test {
     public function newTest(){

          function bigTest(){
               echo 'Big Test Here';
          }
          function smallTest(){
               echo 'Small Test Here';
          }

$obj=new TestClass;

return $obj;
     }

}
$rentry=new test;
$rentry->newTest()->bigTest();

example2

class test {
     public function newTest($method_name){

          function bigTest(){
               echo 'Big Test Here';
          }
          function smallTest(){
               echo 'Small Test Here';
          }

      if(function_exists( $method_name)){    
call_user_func($method_name);
      }
      else{
          echo 'method not exists';
      }
     }

}
$obj=new test;
$obj->newTest('bigTest')

$ rentry-> newTest () -> bigTest (); $ rentry-> newTest () -> smallTest (); ---- घातक त्रुटि: नहीं कर सकते redeclare bigTest () (पहले घोषित
tfont

2

यदि आप एक स्थिर चर या वर्तमान वर्ग के फ़ंक्शन को कॉल करना चाहते हैं self::CONST, $this->CONSTतो आप इसके बजाय उपयोग कर सकते हैं ।


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.