เรียกใช้ฟังก์ชันภายในเมธอด Class?


108

ฉันพยายามหาวิธีการทำสิ่งนี้ แต่ฉันไม่ค่อยแน่ใจว่าจะทำอย่างไร

นี่คือตัวอย่างของสิ่งที่ฉันพยายามทำ:

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

นี่คือส่วนที่ฉันมีปัญหาฉันจะเรียก bigTest () ได้อย่างไร


2
เพียงเพื่อให้แน่ใจว่า: ฟังก์ชันและวิธีการเป็นฟังก์ชันเดียวกันทุกประการ === วิธีการ คำว่าเมธอดมักใช้ในภาษา OO เพื่ออธิบายฟังก์ชันของคลาส
markus

สาเหตุที่บางข้อขาดหายไปคือฉันกำลังจะออกจากสำนักงานดังนั้นฉันจึงมีเวลาไม่นาน
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() {
    ...
}

ไม่ใช่การประกาศฟังก์ชันที่ถูกต้อง - คุณต้องประกาศฟังก์ชันด้วยคีย์เวิร์ด 'function'

ไวยากรณ์ควรเป็น:

public function scoreTest() {
    ...
}

ประการที่สองการรวมฟังก์ชัน bigTest () และ smallTest () ไว้ในฟังก์ชันสาธารณะ () {} จะไม่ทำให้เป็นแบบส่วนตัวคุณควรใช้คีย์เวิร์ดส่วนตัวกับทั้งสองอย่างแยกกัน:

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;
    }
}

นอกจากนี้ยังเป็นแบบแผนในการใช้ชื่อคลาสเป็นตัวพิมพ์ใหญ่ในการประกาศคลาส ('Test')

หวังว่าจะช่วยได้


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

เพื่อให้มี "ฟังก์ชันภายในฟังก์ชัน" ถ้าฉันเข้าใจสิ่งที่คุณกำลังถามคุณต้องใช้ PHP 5.3 ซึ่งคุณสามารถใช้ประโยชน์จากคุณสมบัติการปิดใหม่ได้

ดังนั้นคุณสามารถมี:

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

3

ในการเรียกใช้เมธอดใด ๆ ของอ็อบเจ็กต์ที่สร้างอินสแตนซ์จากคลาส (พร้อมคำสั่งใหม่) คุณต้อง "ชี้" ไปที่มัน จากภายนอกคุณเพียงแค่ใช้ทรัพยากรที่สร้างโดยคำสั่งใหม่ ภายในออบเจ็กต์ใด ๆ ที่ PHP สร้างขึ้นโดยใหม่จะบันทึกทรัพยากรเดียวกันลงในตัวแปร $ this ดังนั้นภายในคลาสคุณต้องชี้ไปที่เมธอดโดย $ this ในชั้นเรียนของคุณหากต้องการเรียกใช้smallTestจากในชั้นเรียนคุณต้องบอก PHP ว่าวัตถุใดที่สร้างขึ้นโดยคำสั่งใหม่ที่คุณต้องการเรียกใช้เพียงเขียน:

$this->smallTest();

ข้อผิดพลาดร้ายแรง: การใช้ $ this เมื่อไม่ได้อยู่ในบริบทของวัตถุ
Stnfordly

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();

ตัวอย่าง 2

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 (); ---- ข้อผิดพลาดร้ายแรง: ไม่สามารถประกาศ bigTest () อีกครั้ง (ประกาศก่อนหน้านี้
tfont

2

คุณยังสามารถใช้self::CONSTแทน$this->CONSTถ้าคุณต้องการเรียกตัวแปรคงที่หรือฟังก์ชันของคลาสปัจจุบัน


2
  class sampleClass
    { 
        public function f1()
        {
           return "f1 run";
        }

        public function f2()
        {
           echo ("f2 run" );
           $result =  $this->f1();
           echo ($result);
        }   

    f2();  

    }

เอาต์พุต:

f2 รัน f1 run

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.