¿Llamar a una función dentro de un método Class?

108

He estado tratando de averiguar cómo hacer esto, pero no estoy muy seguro de cómo hacerlo.

Aquí hay un ejemplo de lo que estoy tratando de hacer:

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

Aquí está la parte con la que tengo problemas, ¿cómo llamo a bigTest ()?

WAC0020
fuente
2
Solo para asegurarse: una función y un método es exactamente la misma función === método. El término método se usa con más frecuencia en el lenguaje OO para describir la función de una clase.
Markus
La razón por la que faltan algunos de los términos es que estaba saliendo de la oficina, por lo que tenía poco tiempo.
WAC0020

Respuestas:

201

Prueba este:

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();
Sergey Kuznetsov
fuente
1
¿Es posible ejecutar un function()desde otra página .php dentro de una función de clase y luego obtener resultados dentro de la función de clase? por ejemplo, tengo una consulta que selecciona todo de una tabla y luego devuelve un conjunto de resultados para recuperar todos. ¿Es posible recorrer ese conjunto de resultados dentro de una función de clases? por ejemploclass query{ public function show(){ getResults(); while($stmt->fetchCollumn()){ ECHO RESULTS HERE }
James111
22

La muestra que proporcionó no es PHP válida y tiene algunos problemas:

public scoreTest() {
    ...
}

no es una declaración de función adecuada; debe declarar funciones con la palabra clave 'función'.

La sintaxis debería ser más bien:

public function scoreTest() {
    ...
}

En segundo lugar, incluir las funciones bigTest () y smallTest () en la función pública () {} no las hace privadas; debe usar la palabra clave privada en ambas de forma 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;
    }
}

Además, es una convención poner en mayúsculas los nombres de las clases en las declaraciones de clases ('Prueba').

Espero que ayude.

pjbeardsley
fuente
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;
    }
 }
Meganathan S
fuente
10

Creo que estás buscando algo como este.

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();
Ali Hasan
fuente
3

Necesita llamar newTestpara hacer que las funciones declaradas dentro de ese método sean “visibles” (vea Funciones dentro de funciones ). Pero eso son solo funciones normales y no métodos.

Gumbo
fuente
3

Para tener una "función dentro de una función", si entiendo lo que está preguntando, necesita PHP 5.3, donde puede aprovechar la nueva función de cierre.

Entonces podrías tener:

public function newTest() {
   $bigTest = function() {
        //Big Test Here
   }
}
estúpido
fuente
3

Para llamar a cualquier método de un objeto instanciado de una clase (con la declaración nueva), debe "señalarlo". Desde el exterior, solo usa el recurso creado por la nueva declaración. Dentro de cualquier objeto PHP creado por new, guarda el mismo recurso en la variable $ this. Entonces, dentro de una clase DEBE apuntar al método por $ this. En su clase, para llamar smallTestdesde dentro de la clase, debe decirle a PHP cuál de todos los objetos creados por la nueva declaración desea ejecutar, simplemente escriba:

$this->smallTest();
Ingeniero
fuente
Error fatal: usar $ this cuando no está en el contexto del objeto
Stnfordly
2

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

ejemplo2

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')
zloctb
fuente
$ rentry-> newTest () -> bigTest (); $ rentry-> newTest () -> smallTest (); ---- Error fatal: no se puede volver a declarar bigTest () (declarado anteriormente.
tfont
2

También puede usar en self::CONSTlugar de $this->CONSTsi desea llamar a una variable o función estática de la clase actual.

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

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

    f2();  

    }

salida:

f2 ejecutar f1 ejecutar

Masoud Siahkali
fuente