php.de

Zurück   php.de > Webentwicklung > Software-Design

Software-Design Diskussionen auf Profi-Niveau: PHP Lösungen auf konzeptioneller Ebene

Antwort
 
LinkBack Themen-Optionen Bewertung: Bewertung: 1 Stimmen, 5,00 durchschnittlich.
Alt 29.05.2011, 12:51  
Benutzer
 
Registriert seit: 29.05.2011
Beiträge: 58
PHP-Kenntnisse:
Anfänger
axelf befindet sich auf einem aufstrebenden Ast
Standard Implementierung vieler Getter bzw. Setter-Methoden

Hallo,

mitunter enthält eine Klasse ja sehr viele Eigenschaften.
Benutzt man die magischen Mehoden __set bzw. __get, muss man nicht für jeder Eigenschaft eine Methode schreiben. Jedoch kann man dann auch die jeweiligen Werte nicht mehr beeinflussen (evtl. möchte ich ja einen Wert in der Setter-Methode prüfen). Bei 20 Eigenschaften hat man jeweils 20 Getter und 20 Setter.

Ausserdem soll verhindert werden, das man direkt auf eine Variable von aussen zugreifen kann. Das geht meines Wissens ja sowieso nur mit einem Getter / Setter und nicht mit magischen Methoden

Was ist hier ein guter Weg? Für jede Eigenschaft einen Setter / Getter oder gibts auch einen Weg, der die Vorteile von beiden Varianten verbinden kann?
axelf ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

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

Alt 29.05.2011, 12:58  
Moderator¹
 
Registriert seit: 28.03.2010
Beiträge: 7.470
PHP-Kenntnisse:
Fortgeschritten
ChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer Anblick
Standard

Zitat:
Zitat von axelf Beitrag anzeigen
Benutzt man die magischen Mehoden __set bzw. __get, muss man nicht für jeder Eigenschaft eine Methode schreiben. Jedoch kann man dann auch die jeweiligen Werte nicht mehr beeinflussen (evtl. möchte ich ja einen Wert in der Setter-Methode prüfen).
Sowohl __get als auch __set bekommen den Namen der Property übergeben.
Daran, per switch o.ä. für einige oder auch alle Properties, die darüber angesprochen werden, eine Sonderbehandlung zu implementieren, hindert dich also niemand.

Zitat:
Ausserdem soll verhindert werden, das man direkt auf eine Variable von aussen zugreifen kann. Das geht meines Wissens ja sowieso nur mit einem Getter / Setter und nicht mit magischen Methoden
Auch daran, eine Exception zu schmeißen, wenn dir der Zugriff nicht passt, hindert dich niemand.
__________________
RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
ChrisB ist offline   Mit Zitat antworten
Alt 29.05.2011, 13:13  
Benutzer
 
Registriert seit: 29.05.2011
Beiträge: 58
PHP-Kenntnisse:
Anfänger
axelf befindet sich auf einem aufstrebenden Ast
Standard

Hi,

also ist es letztlich die persönliche Entscheidung wie man sowas löst?
Die switch-Anweisung würde ja mitunter auch sehr groß werden.

Was ist denn besserer Stil? Die Verwendung der magischen Methoden oder das alles selbst zu schreiben?
axelf ist offline   Mit Zitat antworten
Alt 29.05.2011, 13:30  
Moderator¹
 
Registriert seit: 28.03.2010
Beiträge: 7.470
PHP-Kenntnisse:
Fortgeschritten
ChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer Anblick
Standard

Diese magischen Methoden kommen sowieso nur zum Zug, wenn die Sichtbarkeit den direkten Zugriff nicht erlaubt.

Getter und Setter nur zum „Durchreichen“ zu nutzen, ist Unsinn. Wenn keinerlei Kontrolle erforderlich ist - dann wählt man public als Sichtbarkeit, und gut.

Bei den Eigenschaften, die aber aus gutem Grund private oder protected deklariert sind, wirst du dir aber sicher auch etwas dabei gedacht haben. Dass die dann jeweils eigene explizite Getter/Setter haben, wenn erforderlich, da spricht m.E. nichts gegen.
Wenn die magischen Methoden also nur aus „Faulheit“ exzessiv genutzt werden - dann sollte erst mal das Sichtbarkeits-Konzept der Eigenschaften überdacht werden.
__________________
RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
ChrisB ist offline   Mit Zitat antworten
Alt 29.05.2011, 13:45  
Erfahrener Benutzer
 
Registriert seit: 23.08.2010
Beiträge: 495
PHP-Kenntnisse:
Fortgeschritten
mimomamu sorgt für eine eindrucksvolle Atmosphäremimomamu sorgt für eine eindrucksvolle Atmosphäre
Standard

Zitat:
Zitat von ChrisB Beitrag anzeigen
Getter und Setter nur zum „Durchreichen“ zu nutzen, ist Unsinn. Wenn keinerlei Kontrolle erforderlich ist - dann wählt man public als Sichtbarkeit, und gut.
Insbesondere wenn sich Überprüfungen später doch als notwendig erweisen, leisten magische Methoden gute Dienste.

Vorher:
PHP-Code:
class Foo {
  public 
$Bar;

Nachher:
PHP-Code:
class Foo {
  public function 
__set($name$value) {
    switch (
$name) {
      case 
'Bar':
        if (
is_int($value)) $this->bar $value; else throw new Exception('Integer expected');
        break;
    }
  }
  public function 
__get($name) {
    switch (
$name) {
      case 
'Bar':
        return 
$this->bar;
    }
  }
  private 
$bar;

Beide Klassen sehen von außen betrachtet gleich aus.
__________________
Meinungen, die ich geäußert habe, sind nicht notwendigerweise meine eigenen. Abweichungen von der deutschen Rechtschreibung unterliegen dem Urheberrecht, dürfen aber unter den Bedingungen von verwendet werden
mimomamu ist offline   Mit Zitat antworten
Alt 29.05.2011, 14:02  
Benutzer
 
Registriert seit: 29.05.2011
Beiträge: 58
PHP-Kenntnisse:
Anfänger
axelf befindet sich auf einem aufstrebenden Ast
Standard

Hi,

danke erstmal für die Antworten.
Ich hätte hier:

Zitat:
Zitat von mimomamu Beitrag anzeigen
PHP-Code:
class Foo {
  public function 
__set($name$value) {
    switch (
$name) {
      case 
'Bar':
        if (
is_int($value)) $this->bar $value; else throw new Exception('Integer expected');
        break;
    }
  }
  public function 
__get($name) {
    switch (
$name) {
      case 
'Bar':
        return 
$this->bar;
    }
  }
  private 
$bar;

wohl sowas geschrieben:

PHP-Code:
public function setBar($value){
  if (
is_int($value)){
    
$this->bar $value
  }else {
    throw new 
Exception('Integer expected');
  }
}

public function 
getBar(){
    return 
$this->bar;

Aber hier wurde ja schon gesagt, das es immer auf den jeweiligen Fall ankommt.

Eine Frage noch:
Wie kann man denn eigene Getter / Setter und die magischen Methoden mischen? also wenn ich für manche Variablen die magische Methode benutzen will und für andere eigene Methoden? Reicht es dann aus einfach die Sichtbarkeit von public auf private / protected zu setzen?
axelf ist offline   Mit Zitat antworten
Alt 29.05.2011, 14:07  
Moderator
 
Benutzerbild von Chriz
 
Registriert seit: 11.05.2008
Beiträge: 6.269
Chriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer Anblick
Standard

Faulheit sollte kein Argument sein, schlechten Programmierstil anzuwenden. Du kannst wunderbar mit einem kleinen Codegenerator die Methoden generieren.
__________________
"Nuschel ich?" - "Was?"
Chriz ist offline   Mit Zitat antworten
Alt 29.05.2011, 14:07  
Moderator¹
 
Registriert seit: 28.03.2010
Beiträge: 7.470
PHP-Kenntnisse:
Fortgeschritten
ChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer Anblick
Standard

Zitat:
Zitat von axelf Beitrag anzeigen
Reicht es dann aus einfach die Sichtbarkeit von public auf private / protected zu setzen?
Nein.
__________________
RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
ChrisB ist offline   Mit Zitat antworten
Alt 29.05.2011, 14:11  
Benutzer
 
Registriert seit: 29.05.2011
Beiträge: 58
PHP-Kenntnisse:
Anfänger
axelf befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von Chriz Beitrag anzeigen
Faulheit sollte kein Argument sein, schlechten Programmierstil anzuwenden. Du kannst wunderbar mit einem kleinen Codegenerator die Methoden generieren.
Hatte ich bisher auch immer so gemacht, bzw. geht das über die IDE (Netbeans). Der generiert aus den Eigenschaften die jeweiligen getter und setter.
axelf ist offline   Mit Zitat antworten
Alt 29.05.2011, 18:04  
Erfahrener Benutzer
 
Registriert seit: 13.05.2011
Beiträge: 188
PHP-Kenntnisse:
Fortgeschritten
php1704 wird schon bald berühmt werden
Standard

Zitat:
Wie kann man denn eigene Getter / Setter und die magischen Methoden mischen?
Du könntest __call verwenden:

PHP-Code:
class Foo {
    protected 
$_properties = array(
        
'date' => 0,
        
'name' => '',
        
'active' => false,
        
'counter' => 0
    
);
    
    public function 
__call($name$arguments)
    {
        switch (
substr($name03)) {
            case 
"set":
                
$name lcfirst(substr($name3));
                if (
array_key_exists($name$this->_properties)) {
                    
$this->_properties[$name] = $arguments[0];
                } else {
                    throw new 
Exception("Unknown property '" $name "'");
                }
                break;
                
            case 
"get":
                
$name lcfirst(substr($name3));        
                if (
array_key_exists($name$this->_properties)) {
                    return 
$this->_properties[$name];
                }
                return 
null;
                break;
                
            default:
                if(
method_exists($this$name)) {
                    
call_user_func_array($this->$name(), $arguments);
                } else {
                    throw new 
Exception("Unknown method '" $name "'");
                }
        }
    }
    
    public function 
setCounter($value)
    {
        if (
$value 0) {
            
$value 0;
        }
        
        if (
$value 10) {
            
$value 10;
        }
        
        
$this->_options['counter'] = $value;
    }
}

/*
$bar = new Foo();
$bar->setName('Heinz');
$bar->setCounter(15);
$bar->setHugo(2); // -> Exception "unknown property"
$bar->michtGibtsNicht(); // -> Exception "unknown method"
echo "\n";
echo "Name: " . $bar->getName() . "\n";
echo "Counter: ". $bar->getCounter() . "\n";
*/ 
Grüße.
php1704 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

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
setter methode, php getter methoden, getter methode php, getter setter php, getter setter methoden, php setter getter, netbeans php generate getter, php magische methoden setter getter, php getter und setter methoden, getter setter methoden php, getter und setter methoden php, magische setter php, php getter setter, getter setter methode für was, was ist getter setter methode, setter getter methode, netbeans 7 getter setter, erst setter dann getter, php getter-methoden, php klassen eigenschaften getter

Alle Zeitangaben in WEZ +2. Es ist jetzt 01:35 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