php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger

PHP Einsteiger PHP Problemlösungen für Spracheinsteiger
Archive: 2004, 2004/2, 2005, 2005/2, 2006, 2007, 2008, 2009, 2010,

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 31.01.2011, 11:17  
Gesperrt
 
Registriert seit: 03.12.2010
Beiträge: 860
PHP-Kenntnisse:
Anfänger
coola wird schon bald berühmt werden
Standard [Erledigt] Unittests mit private Methoden

Hallo

Ich kämpfe mal wieder damit herum, wie man in OOP etwas richtig programmiert.

Ich habe folgende Klasse:
PHP-Code:
class X
{
   private function 
_algorithmus()
   {
      
// hier passiert irgendetwas kompliziertes
   
}
   public function 
m()
   {
      
// irgendwelche Befehle

      // dann kommt ein komplizierter Algorithmus:
      
$this->_algorithmus(); // in einer eigenen Methode ausgelagert

      // dann kommen wieder irgendwelche Befehle
   
}

Hierin gibt es also die public Methode 'm()'. In dieser Methode stünde ein komplizierter Algorithmus. Um diesen jedoch extra gründlich mittels UnitTests prüfen zu können, ist er in einer eigenen Methode '_algorithmus()' ausgelagert. Diese darf dann nur private sein.

Allerdings kann ich von außen nicht auf eine private Methode zugreifen. Ich kann also keine Unittests durchführen.

Also müsste ich die private Methode entweder public machen oder eine zusätzliche public-Methode definieren, z. B.:
PHP-Code:
class X
{
   private function 
_algorithmus()
   {
      
// hier passiert irgendetwas kompliziertes
   
}
   public function 
testAlgorithmus() // diese Methode ist dann nur für die Unit-Tests
   
{
      
// macht nur eines: es ruft die private Methode _algorithmus auf:
      
$this->_algorithmus();
   }
   public function 
m()
   {
      
// irgendwelche Befehle

      // dann kommt ein komplizierter Algorithmus:
      
$this->_algorithmus();

      
// dann kommen wieder irgendwelche Befehle
   
}

Allerdings finde ich das auch nicht so toll. Gibt es vielleicht noch eine andere Lösung??
coola ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 31.01.2011, 12:59  
da schreibt der ElePHPant
 
Benutzerbild von Flor1an
 
Registriert seit: 18.06.2008
Beiträge: 8.903
PHP-Kenntnisse:
Fortgeschritten
Flor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer Anblick
Standard

Eigentlich sollten private Methoden ja "versteckt" sein. Und deshalb sollten auch nur öffentliche Methoden getestet werden. Wenn du nämlich mal an deiner Implementierung was verändern willst bleibt vlt. das Verhalten nach außen gleich, alle Unittests würden also weiter durchlaufen, aber die internen Funktionen funktionieren möglicherweise anders. In deinem Fall würde dann doch der Unittest brechen.

Falls du es trotzdem brauchst, was bei komplizierten Methoden vlt. doch sinnvoll sein könnte, dann probiers doch mit Reflection.

PHP-Code:
protected static function getMethod($name) {
  
$class = new ReflectionClass('MyClass');
  
$method $class->getMethod($name);
  
$method->setAccessible(true);
  return 
$method;
}

public function 
testFoo() {
  
$foo self::getMethod('foo');
  
$obj = new MyClass();
  
$foo->invokeArgs($obj, array(...));
  ...

Flor1an ist offline   Mit Zitat antworten
Alt 31.01.2011, 13:19  
Gesperrt
 
Registriert seit: 03.12.2010
Beiträge: 860
PHP-Kenntnisse:
Anfänger
coola wird schon bald berühmt werden
Standard

Bin eigentlich kein Fan von Reflection, ehrlich gesagt. Reflection sollte man meiner Meinung nach eher nur zu Dokumentationszwecken verwenden.
coola ist offline   Mit Zitat antworten
Alt 31.01.2011, 13:25  
da schreibt der ElePHPant
 
Benutzerbild von Flor1an
 
Registriert seit: 18.06.2008
Beiträge: 8.903
PHP-Kenntnisse:
Fortgeschritten
Flor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer Anblick
Standard

Reflections sind genau für sowas gut. Unittests gehören ja nicht zur Anwendung selber. Und zum testen sind Reflections doch wie geschaffen dafür.
Flor1an ist offline   Mit Zitat antworten
Alt 31.01.2011, 13:39  
Gesperrt
 
Registriert seit: 03.12.2010
Beiträge: 860
PHP-Kenntnisse:
Anfänger
coola wird schon bald berühmt werden
Standard

OHHHH!!!!! Jetzt wird mir erst bewusst, was du da eigentlich machst. Du greifst dann von außen auf eine private-deklarierte Methode zu? Ich kann das leider nicht ausprobieren, weil ich nur 5.3.1 habe. Aber das ist ja echt arg! Da könnte ich ja rein theoretisch via Reflection auf jede beliebige private-Methode zugreifen. AU WEH! Was haben sich die PHP-Programmierer denn dabei gedacht.?.?.?
coola ist offline   Mit Zitat antworten
Alt 31.01.2011, 13:44  
da schreibt der ElePHPant
 
Benutzerbild von Flor1an
 
Registriert seit: 18.06.2008
Beiträge: 8.903
PHP-Kenntnisse:
Fortgeschritten
Flor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer Anblick
Standard

Das hat nichts mit PHP zutun. Das gibts auch in anderen Sprachen (Java zum Beispiel). Reflections sind ein mächtiges Werkzeug grade um etwas zu debuggen oder zu testen. In der Anwendung selber solltest du eigentlich drauf verzichten und eben den normalen OOP Paradigmen gerecht werden. Aber eben genau so Dinge die nicht zur Anwendung gehören und komplett von außen (einmalig, also Debugging, Unittesting) getan werden ist das nen super Werkzeug.

Und funktionieren Reflections nicht ab PHP 5 ?
Flor1an ist offline   Mit Zitat antworten
Alt 31.01.2011, 14:01  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.987
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Ansonsten kann man die Klasse auch einfach noch einmal ableiten. Deshalb solltest DU wo möglich auch immer protected statt private verwenden.

Zitat:
AU WEH! Was haben sich die PHP-Programmierer denn dabei gedacht.?.?.?
Member visibility dient keinen Sicherheitsaspekten. Von daher ist da nichts schlimmes dran.
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist offline   Mit Zitat antworten
Alt 31.01.2011, 14:56  
Gesperrt
 
Registriert seit: 03.12.2010
Beiträge: 860
PHP-Kenntnisse:
Anfänger
coola wird schon bald berühmt werden
Standard

setAccessible gibt es anscheinend erst ab 5.3.2

Na OK. Also mit Reflections. Danke
coola ist offline   Mit Zitat antworten
Alt 31.01.2011, 15:02  
da schreibt der ElePHPant
 
Benutzerbild von Flor1an
 
Registriert seit: 18.06.2008
Beiträge: 8.903
PHP-Kenntnisse:
Fortgeschritten
Flor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer Anblick
Standard

Ab 5.3.0 steht doch im Manual oder?
Flor1an ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[Erledigt] Objekt mit statischen Methoden hts JavaScript, Ajax und mehr 3 18.12.2010 21:07
VisualSVN Server und PHP5 Frederic_S Server, Hosting und Workstations 12 18.11.2010 17:50
Klassendesign SilentSight PHP Tipps 2010 13 24.09.2010 08:55
PHP Unittesting Flor1an PHP-Fortgeschrittene 42 09.06.2010 16:34
[Erledigt] Werte aus private function werden in public function nciht übernommen litterauspirna PHP Tipps 2010 3 03.02.2010 11:31
PEAR::Auth - MVC Implementierung dergestalter PHP-Fortgeschrittene 6 06.06.2009 11:49
Kindklasse: Methoden über _call() ergänzen? ciss PHP Tipps 2008 2 29.12.2008 18:08
[Erledigt] Vererbung - Zugriff auf Elternmethoden nicht möglich unimow PHP Tipps 2008 5 03.11.2008 18:53
[Erledigt] Methoden auf Objekt aufrufen (und fangen), die nicht existieren tsisson PHP Tipps 2008 2 07.10.2008 18:19
Referenzen Private Methoden. notyyy PHP-Fortgeschrittene 5 29.05.2008 09:40
UML - Abstrakte und vererbte Methoden zwingend anzugeben? MaMo-Net Off-Topic Diskussionen 3 17.03.2008 06:04
public, protected, private Funktionen ecomeback PHP Tipps 2007 10 21.08.2007 02:21
Code Syntax Highlighting imported_Lumio PHP-Fortgeschrittene 9 16.08.2005 11:06
PHPBB - Private Stümper PHP Tipps 2005-2 7 22.06.2005 14:49

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
auf private methode mittels reflection zugreifen, php private function befehl, js private methoden zugreifen, im unittest auch auf private methoden zugreifen, php private methoden public machen, php reflectionclass protected static method accessible, wann sollte eine methode provate sein, php private methode testen, private methods reflection zugreifen, unittest private funktion, private methode redefinieren, php change visibility of method in unit tests, php unittest -phpunit, javascript private methode ruft öffentliche methode, unittest private methoden php, php reflection auf private methoden zugreifen, zugriff auf private methoden reflection, auf private methoden zugreifen, php unittest, php unittest private function

Alle Zeitangaben in WEZ +2. Es ist jetzt 18:02 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum