Sınıf yöntemi içinde bir işlevi mi çağırıyorsunuz?


108

Bunu nasıl yapacağımı bulmaya çalışıyordum ama nasıl yapacağımı tam olarak bilmiyorum.

İşte yapmaya çalıştığım şeyin bir örneği:

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

İşte sorun yaşadığım kısım, nasıl bigTest () çağırırım?


2
Sadece emin olmak için: bir işlev ve bir yöntem tam olarak aynı işlevdir === yöntem. Yöntem terimi daha çok OO dilinde bir sınıfın işlevini tanımlamak için kullanılır.
markus

Bazı terimlerin eksik olmasının nedeni, ofisten çıkmak üzereydim, bu yüzden vaktim azdı.
WAC0020

Yanıtlar:


201

Bunu dene:

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()Bir sınıf işlevi içinde başka bir .php sayfasından bir tane çalıştırmak ve sonra sınıf işlevi içindeki sonuçları almak mümkün müdür ? Örneğin, bir tablodan tümünü seçen ve ardından tüm sonuç kümesini getirmeyi döndüren bir sorgum var. Bir sınıflar işlevi içindeki sonuç kümesinde döngü yapmak mümkün müdür? örneğinclass query{ public function show(){ getResults(); while($stmt->fetchCollumn()){ ECHO RESULTS HERE }
James111

22

Sağladığınız örnek geçerli PHP değil ve birkaç sorunu var:

public scoreTest() {
    ...
}

uygun bir işlev bildirimi değildir - işlevleri 'işlev' anahtar sözcüğüyle bildirmeniz gerekir.

Sözdizimi şöyle olmalıdır:

public function scoreTest() {
    ...
}

İkinci olarak, bigTest () ve smallTest () işlevlerini public function () {} içine sarmak onları özel kılmaz - private anahtar sözcüğünü bunların her ikisinde de ayrı ayrı kullanmalısınız:

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

Ayrıca, sınıf bildirimlerinde sınıf adlarının büyük harfle yazılması gelenekseldir ('Test').

Umarım yardımcı olur.


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

Sanırım bunun gibi bir şey arıyorsun.

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

Bir "işlev içinde işleve" sahip olmak için, ne sorduğunuzu anlıyorsam, yeni Kapatma özelliğinden yararlanabileceğiniz PHP 5.3'e ihtiyacınız var.

Böylece sahip olabilirsiniz:

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

3

Bir sınıftan örneklenmiş bir nesnenin herhangi bir yöntemini çağırmak için (new deyimiyle), ona "işaret etmeniz" gerekir. Dışarıdan sadece yeni ifade tarafından oluşturulan kaynağı kullanırsınız. Yeni tarafından oluşturulan herhangi bir PHP nesnesinin içinde, aynı kaynağı $ this değişkenine kaydeder. Dolayısıyla, bir sınıfın içinde yöntemi $ this ile işaret etmeniz GEREKİR. Sınıfınızda, sınıfın smallTestiçinden çağırmak için, PHP'ye yeni deyim tarafından oluşturulan tüm nesnelerden hangisini yürütmek istediğinizi söylemelisiniz, sadece şunu yazın:

$this->smallTest();

Önemli hata: Nesne bağlamında değilken $ this kullanılması
Stnfordly

2

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

örnek2

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 (); ---- Önemli hata: bigTest () yeniden beyan edilemiyor (önceden bildirildi.
tfont

2

Mevcut sınıfın statik bir değişkenini veya işlevini çağırmak istiyorsanız self::CONSTbunun yerine kullanabilirsiniz $this->CONST.


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

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

    f2();  

    }

çıktı :

f2 koş f1 koş

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.