Memanggil fungsi dalam metode Kelas?


108

Saya telah mencoba mencari cara untuk melakukan ini tetapi saya tidak yakin bagaimana caranya.

Berikut adalah contoh dari apa yang saya coba lakukan:

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

Inilah bagian yang bermasalah dengan saya, bagaimana cara memanggil bigTest ()?


2
Hanya untuk memastikan: fungsi dan metode adalah metode fungsi === yang persis sama. Metode istilah lebih sering digunakan dalam bahasa OO untuk mendeskripsikan fungsi suatu kelas.
markus

Alasan beberapa istilah tidak ada adalah karena saya sedang dalam perjalanan keluar kantor, jadi saya kekurangan waktu.
WAC0020

Jawaban:


201

Coba yang ini:

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
Apakah mungkin untuk menjalankan function()dari halaman .php lain di dalam fungsi kelas dan kemudian mengambil hasil di dalam fungsi kelas? misalnya saya memiliki kueri yang memilih semua dari tabel dan kemudian mengembalikan kumpulan hasil ambil semua. Apakah mungkin untuk mengulang melalui hasil yang ditetapkan di dalam fungsi kelas? misalnyaclass query{ public function show(){ getResults(); while($stmt->fetchCollumn()){ ECHO RESULTS HERE }
Yakobus111

22

Sampel yang Anda berikan bukan PHP yang valid dan memiliki beberapa masalah:

public scoreTest() {
    ...
}

bukanlah deklarasi fungsi yang tepat - Anda perlu mendeklarasikan fungsi dengan kata kunci 'function'.

Sintaksnya seharusnya:

public function scoreTest() {
    ...
}

Kedua, menggabungkan fungsi bigTest () dan smallTest () dalam fungsi publik () {} tidak membuatnya pribadi - Anda harus menggunakan kata kunci privat pada keduanya secara individual:

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

Juga, itu adalah konvensi untuk menggunakan nama kelas dalam deklarasi kelas ('Test').

Semoga membantu.


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

Saya pikir Anda sedang mencari sesuatu seperti ini.

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

Anda perlu memanggil newTestuntuk membuat fungsi yang dideklarasikan di dalam metode itu "terlihat" (lihat Fungsi di dalam fungsi ). Tapi itu hanya fungsi normal dan tidak ada metode.


3

Untuk memiliki "fungsi dalam suatu fungsi", jika saya mengerti apa yang Anda tanyakan, Anda memerlukan PHP 5.3, di mana Anda dapat memanfaatkan fitur Penutupan yang baru.

Jadi Anda bisa memiliki:

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

3

Untuk memanggil metode apa pun dari objek yang dipakai dari kelas (dengan pernyataan baru), Anda perlu "menunjuk" ke sana. Dari luar Anda cukup menggunakan sumber daya yang dibuat oleh pernyataan baru. Di dalam objek apa pun yang dibuat PHP oleh new, simpan sumber daya yang sama ke dalam variabel $ this. Jadi, di dalam kelas Anda HARUS menunjuk ke metode dengan $ this. Di kelas Anda, untuk memanggil smallTestdari dalam kelas, Anda harus memberi tahu PHP manakah dari semua objek yang dibuat oleh pernyataan baru yang ingin Anda jalankan, cukup tulis:

$this->smallTest();

Kesalahan fatal: Menggunakan $ this jika tidak dalam konteks objek
Stnfordly

2

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

contoh2

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 (); ---- Kesalahan fatal: Tidak dapat mendeklarasikan ulang bigTest () (sebelumnya dideklarasikan.
tfont

2

Anda juga dapat menggunakan self::CONSTbukan $this->CONSTjika Anda ingin memanggil variabel statis atau fungsi dari kelas saat ini.


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

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

    f2();  

    }

keluaran:

f2 jalankan f1 run

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.