Gọi một hàm trong một phương thức Class?


108

Tôi đã cố gắng tìm ra cách tiếp tục thực hiện điều này nhưng tôi không chắc chắn về cách thức.

Đây là một ví dụ về những gì tôi đang cố gắng làm:

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

Đây là phần tôi đang gặp vấn đề, làm cách nào để gọi bigTest ()?


2
Chỉ cần đảm bảo: một hàm và một phương thức hoàn toàn giống một hàm === phương thức. Thuật ngữ phương thức thường được sử dụng trong ngôn ngữ OO để mô tả chức năng của một lớp.
markus

Lý do một số điều khoản bị thiếu là tôi đang trên đường rời văn phòng, vì vậy tôi đã thiếu thời gian.
WAC0020

Câu trả lời:


201

Hãy thử cái này:

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
Có thể chạy một function()trang .php khác bên trong một hàm lớp và sau đó lấy kết quả bên trong hàm lớp không? Ví dụ: tôi có một truy vấn chọn tất cả từ một bảng và sau đó trả về một tập hợp kết quả tìm nạp tất cả. Có thể lặp qua tập kết quả đó bên trong một hàm lớp không? ví dụclass query{ public function show(){ getResults(); while($stmt->fetchCollumn()){ ECHO RESULTS HERE }
James111

22

Mẫu bạn cung cấp không phải là PHP hợp lệ và có một số vấn đề:

public scoreTest() {
    ...
}

không phải là một khai báo hàm thích hợp - bạn cần phải khai báo các hàm với từ khóa 'function'.

Cú pháp nên là:

public function scoreTest() {
    ...
}

Thứ hai, việc gói các hàm bigTest () và smallTest () trong hàm public () {} không đặt chúng ở chế độ riêng tư - bạn nên sử dụng từ khóa private cho cả hai hàm này riêng lẻ:

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

Ngoài ra, nó là quy ước để viết hoa tên lớp trong khai báo lớp ('Kiểm tra').

Hy vọng rằng sẽ giúp.


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

Tôi nghĩ rằng bạn đang tìm kiếm một cái gì đó giống như cái này.

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

Bạn cần gọi newTestđể làm cho các hàm được khai báo bên trong phương thức đó “hiển thị” (xem Các hàm trong các hàm ). Nhưng đó chỉ là các hàm bình thường và không có phương thức.


3

Để có một "hàm trong một hàm", nếu tôi hiểu bạn đang hỏi gì, bạn cần PHP 5.3, nơi bạn có thể tận dụng tính năng C Close mới.

Vì vậy, bạn có thể có:

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

3

Để gọi bất kỳ phương thức nào của một đối tượng được khởi tạo từ một lớp (với câu lệnh mới), bạn cần phải "trỏ" đến nó. Từ bên ngoài, bạn chỉ cần sử dụng tài nguyên được tạo bởi câu lệnh mới. Bên trong bất kỳ đối tượng nào mà PHP tạo bởi new, sẽ lưu cùng một tài nguyên vào biến $ this. Vì vậy, bên trong một lớp, bạn PHẢI trỏ đến phương thức bằng $ this. Trong lớp của bạn, để gọi smallTesttừ bên trong lớp, bạn phải cho PHP biết đối tượng nào được tạo bởi câu lệnh mới mà bạn muốn thực thi, chỉ cần viết:

$this->smallTest();

Lỗi nghiêm trọng: Sử dụng $ this khi không ở trong ngữ cảnh đối tượng
Stnfordly

2

ví dụ 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 (); ---- Lỗi nghiêm trọng: Không thể khai báo lại bigTest () (đã khai báo trước đó.
tfont

2

Bạn cũng có thể sử dụng self::CONSTthay vì $this->CONSTnếu bạn muốn gọi một biến tĩnh hoặc hàm của lớp hiện tại.


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

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

    f2();  

    }

đầu ra:

f2 chạy f1 chạy

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.