2010-09-07 22 views
2

Cela peut sembler un peu compliqué. Les doigts croisés, je les croise clairement. Je travaille dans un framework MVC en PHP.PHP: Appeler une méthode privée à partir d'une classe en train de mourir gravement

je charge un contrôleur/rapport/index qui appelle à une aide

<? class ReportController extends Controller { 
     public function index() { 
      $foo = MainReport::get_data($_REQUEST); 
     } 

    } 
?> 

intérieur de l'aide

<? class MainReport extends foo { 
     public function get_data($_REQUEST) { 
      // do stuff 
      return $stuff_done; 
     } 

} 
?> 

Je lance comme^tout cela est bien et bon. Malheureusement, je veux courir comme ça:

<? class MainReport extends foo { 
     private function do_stuff() { 
      // do even better stuff here! 
      return $better_stuff; 
     } 
     public function get_data($_REQUEST) { 
      // do stuff 
      $x = $this->do_stuff();  
     } 

} 
?> 

Malheureusement ... quand je tente d'appeler une fonction privée à l'intérieur d'une classe que j'ai appelé d'ailleurs ... (ouf, c'est une bouchée) ... tout meurt. Meurt donc très très mal que je n'ai même pas une erreur.

Il me semble évident que j'ai un problème de syntaxe incroyablement dorky ... mais comment accéder correctement aux fonctions privées à l'intérieur d'une classe?

Peut-être quelque chose comme: self :: do_stuff(); Qu'en est-il de la déclaration et de l'accès aux variables de classe privées?

private $bar = array(); 

Toute aide serait la bienvenue.

Répondre

6

Vous appelez votre fonction d'un contexte statique,

MainReport::get_data($_REQUEST) 

donc $ cela n'existe pas tandis qu'à l'intérieur de cette fonction.

Si vous souhaitez appeler une autre fonction de classe dans un contexte statique, vous devez également l'appeler de manière statique.

-à-dire

public function get_data($_REQUEST) { 
     // do stuff 
     $x = MainReport::do_stuff();  
    } 

Vous pouvez également créer une instance de votre classe dans l'appel initial et utiliser l'instance:

$myMainReport = new MainReport(); 
$myMainReport->get_data($_REQUEST); 

Ensuite, votre code de classe fonctionnera comme prévu

+0

doit pas être « fonction statique publique get_data ($ _ REQUEST) "? – sled

+0

vous pouvez appeler une fonction en php de façon statique tant qu'elle ne dépend pas des vars de classe ou des appels de méthode par instance – Zak

+0

Ahhh .... :) merci beaucoup :) Cela m'a tué! –

1

Je viens de trouver que self :: fonctionne aussi bien

si je veux ont des variables de classe privée, je peux déclarer et y accéder en utilisant

private static $foo 

et

self::$foo = "foo"; 

en outre une fonction privée est accessible avec

self::function_foo();