Classメソッド内で関数を呼び出していますか?


108

私はこれを行う方法を理解しようと努めてきましたが、私は方法がよくわかりません。

これが私がやろうとしていることの例です:

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

これが私が問題を抱えている部分ですが、bigTest()を呼び出すにはどうすればよいですか?


2
念のため:関数とメソッドはまったく同じ関数===メソッドです。メソッドという用語は、オブジェクト指向言語でクラスの機能を説明するためによく使用されます。
マーカス2009年

いくつかの条件が欠けている理由は、私がオフィスを出る途中でしたので、時間に余裕がありませんでした。
WAC0020 2009年

回答:


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、2015

22

あなたが提供したサンプルは有効なPHPではなく、いくつかの問題があります:

public scoreTest() {
    ...
}

は適切な関数宣言ではありません-'function'キーワードで関数を宣言する必要があります。

構文は次のようになります。

public function scoreTest() {
    ...
}

次に、bigTest()関数とsmallTest()関数をpublic function(){}でラップしても、それらは非公開にはなりません。これらの両方で個別にprivateキーワードを使用する必要があります。

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

newTestそのメソッド内で宣言された関数を「可視」にするために呼び出す必要があります(関数内の関数を参照)。しかし、それは単なる通常の機能であり、メソッドはありません。


3

「関数内の関数」を持つために、私があなたが何を求めているのか理解している場合、新しいクロージャー機能を利用できるPHP 5.3が必要です。

だからあなたは持つことができます:

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

3

クラスからインスタンス化されたオブジェクトのメソッドを呼び出すには(newステートメントを使用)、そのオブジェクトを「ポイント」する必要があります。外部からは、新しいステートメントによって作成されたリソースを使用するだけです。PHPがnewで作成したオブジェクト内で、同じリソースを$ 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実行

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.