2009-11-12 21 views
82

He estado tratando de descubrir cómo hacerlo, pero no estoy muy seguro de cómo.¿Llamar a una función dentro de un método de clase?

Aquí es 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í es la parte que estoy teniendo problemas con, ¿cómo me llamo bigTest()?

+2

Sólo para asegurarse de: 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

+0

La razón por la que faltan algunos de los términos es que estaba en camino de salir de la oficina, así que tenía poco tiempo. – WAC0020

Respuesta

3

Debe llamar al newTest para que las funciones declaradas dentro de ese método sean "visibles" (consulte Functions within functions). Pero eso son solo funciones normales y ningún método.

173

Prueba con esto:

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

¿Es posible ejecutar una función '()' desde otra página .php dentro de una función de clase y luego tomar los 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 de recuperación. ¿Es posible recorrer ese conjunto de resultados dentro de una función de clases? por ejemplo, 'query class {public function show() { getResults(); while ($ stmt-> fetchCollumn()) { ECHO RESULTS AQUÍ } ' – James111

3

el fin de tener una "función dentro de una función", si entiendo lo que estás pidiendo, necesita PHP 5.3, donde se puede tomar ventaja de la nueva Cierre característica.

lo que podría tener:

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

La muestra que ha proporcionado no es válida PHP y tiene algunos problemas:

public scoreTest() { 
    ... 
} 

no es una declaración de función apropiada - que necesita para declarar funciones con la palabra clave 'función'.

La sintaxis debería ser más bien:

public function scoreTest() { 
    ... 
} 

En segundo lugar, envolviendo el bigTest() y smallTest() en la función pública() {} no que sean privadas - que debe utilizar la palabra clave privada en tanto de estos 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 la convención de capitalizar nombres de las clases en las declaraciones de clase ('Test').

Espero que ayude.

0

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

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') 
+0

$ rentry-> newTest() -> bigTest(); $ rentry-> newTest() -> smallTest(); ---- Error grave: No se puede volver a declarar bigTest() (previamente declarado. – tfont

4

para llamar a cualquier método de un objeto instancia de una clase (con la declaración de nuevo), es necesario "punto" a él . Desde afuera, solo usa el recurso creado por la nueva declaración. Dentro de cualquier objeto PHP creado por nuevo, guarda el mismo recurso en $ esta variable. Entonces, dentro de una clase DEBE señalar el método por $ this. en su clase, para llamar smallTest desde el interior de la clase, debe decirle a PHP que de todos los objetos creados por la nueva declaración de que desea ejecutar, acaba de escribir:

$this->smallTest(); 
6

Creo que está en busca de algo así como éste.

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

También se puede utilizar en lugar de self::CONST$this->CONST si desea llamar a una variable estática o función de la clase actual.

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

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

    f2(); 

    } 

de salida:

carrera f2 f1 corren

1
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; 
    } 
} 
Cuestiones relacionadas