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 Thema bewerten
Alt 02.08.2011, 10:59  
Benutzer
 
Registriert seit: 18.02.2010
Beiträge: 54
PHP-Kenntnisse:
Fortgeschritten
Codercrush ist zur Zeit noch ein unbeschriebenes Blatt
Standard [Erledigt] Getter & Setter in PHP

Guten Tag zusammen,
mich haben das ständige erzeugen der Getter und Setter für jede Variable genervt. Ich weiß das man sie nich undbedingt erstellen muss, aber ich finde das gehört zu einem guten/sauberen Style der Programmierung von Klassen.

Jedenfalls habe ich mir mal Gedanken gemacht und eine "Basis"-Klasse programmiert und tatsächlich mal die magischen Methoden "__set" und "__get" verwendet und eine Typisierung eingabaut. Ich zeige euch einfach mal ein Beispiel:

PHP-Code:
protected $_count null;

public function 
__construct()
{
    
// Variablen deklarieren
    
$this->setVar('count', array('type' => 'int'));
    
    
// Variablen zuweisen (Korrekt)
    
$this->count 0;
    
    
// Variablen zuweisen (Wirft Fehler)
    
$this->count 'asd';

Also das Prinzip is ja egtl ganz Simpel. Man muss die Variable mit "setVar" und dem Typ, wie bool, string, int oder Klassen bzw Interfaces, hinzufügen um für diese Variable einen Setter und Getter zu erstellen.

Vorraussetzung dafür ist das man die Variable mit dem unterstrich beginnend anlegt und man ohne Unterstrich darauf zugreift und somit den Getter und Setter verwendet. Somit ist es also möglich Typisierung in PHP zu benutzen, komfortablen Zugriff zu haben obwohl man trotzdem über Getter und Setter zugreift, hat vllt sogar einen Performancegewinn und man kann sich unmengen an Code sparen.

Ich wollte nur mal wissen was ihr davon haltet. Mal abgesehen davon das man immer von der "Basis"-Klasse ableiten müsste.
__________________
Ich würde so gern die Welt verändern doch Gott gibt mir den Quellcode nicht.
Compiler sind wie Franzosen.. schnauzen einen immer nur an, wenn man ihre Sprache nich perfekt spricht.
Codercrush ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

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

Alt 02.08.2011, 11:15  
fab
Erfahrener Benutzer
 
Benutzerbild von fab
 
Registriert seit: 28.07.2010
Beiträge: 2.308
PHP-Kenntnisse:
Fortgeschritten
fab ist ein Lichtblickfab ist ein Lichtblickfab ist ein Lichtblickfab ist ein Lichtblickfab ist ein Lichtblick
Standard

Das mit der Basisklasse würde mich ehrlich gesagt schon davon abhalten, es zu nutzen aber hier haben wir doch mal ein schönes Einsatzgebiet für Traits. Kann man sich deine Implementierung von setVar mal ansehen? Ich bin etwas zwiegespalten, da ich eigentlich lieber richtige Methoden benutze (s.u.), andererseits ist sowas zumindest als Proof of Concept immer ganz interessant.

Kritikpunkte, praktisch gesehen: Primitive Getter und Setter generiert mir die IDE, also Arbeit sparen würde ich damit nicht. Die Klassen mögen übersichtlicher aussehen aber das fällt IMHO nicht so sehr ins Gewicht. Andererseits verliert man die Vorteile von Code Completion und phpDoc, es sei denn, die öffentlichen Attribute bzw. Getter und Setter werden über den DocBlock bekanntgemacht:
PHP-Code:
/**
 *@method int getVar() getCount()
 *@method void setCount() setCount(int $count)
 *@property int $count
 */ 
Und damit sind die vermeintlichen Vorteile wieder dahin...
fab ist offline   Mit Zitat antworten
Alt 02.08.2011, 11:21  
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

Ja bis PHP 5.4. mit Traits kommt müssen wir wohl noch bissl warten Vlt. gibts das als Weihnachtsgeschenk.
Flor1an ist offline   Mit Zitat antworten
Alt 02.08.2011, 11:51  
Erfahrener Benutzer
 
Registriert seit: 30.07.2008
Beiträge: 1.169
PHP-Kenntnisse:
Fortgeschritten
xm22 sorgt für eine eindrucksvolle Atmosphärexm22 sorgt für eine eindrucksvolle Atmosphärexm22 sorgt für eine eindrucksvolle Atmosphäre
Standard

Wer mal mit Magento gearbeitet hat, der wird froh sein, wenn er dedizierte Getter und Setter hat..
xm22 ist offline   Mit Zitat antworten
Alt 02.08.2011, 12:33  
Benutzer
 
Registriert seit: 18.02.2010
Beiträge: 54
PHP-Kenntnisse:
Fortgeschritten
Codercrush ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Hier also mal ein Teil meines Codes bzw der setVar-Funktion:

PHP-Code:
private $_varOptions = array
(
    
'type'     => 'mixed',
    
'setter'    => true,
    
'getter'    => true,
    
'public'    => true,
    
'callback'    => null
);
    
public function 
setVar($key$options)
{
    
$options array_merge($this->_varOptions$options);
        
    
$this->_vars[$key] = $options;

Aber ich glaube das wichtiger ist dann wohl eher die __set methode die ich hier mal poste:

PHP-Code:
public final function __set($key$value)
{
    
$name '_'$key;
        
    if (isset(
$this->_vars[$key]) && property_exists($this$name))
    {
        
$type $this->_vars[$key]['type'];
        
$success false;
            
        if (
$this->_vars[$key]['public'] != true)
        {
            
$backtrace debug_backtrace();
            
$backtrace end($backtrace);
                
            if (
$backtrace['class'] != get_class($this))
            {
                require_once(
'CodEvo/Object/Exception.php');
                throw new 
CodEvo_Object_Exception('Auf die Variable '$key .' darf nicht von außen zugegriffen werden');
            }
        }
            
        if (
$this->_vars[$key]['setter'] != true)
        {
            require_once(
'CodEvo/Object/Exception.php');
            throw new 
CodEvo_Object_Exception('Die Variable '$key .' darf nicht überschrieben werden');
        }
            
        if (
$this->_vars[$key]['callback'] !== null)
        {
            
$function $this->_vars[$key]['callback'];
                
            if (
method_exists($this$function))
            {
                
$value $this->$function($value$type);
                    
                if (
$value === null)
                {
                    require_once(
'CodEvo/Object/Exception.php');
                    throw new 
CodEvo_Object_Exception('Der Rückgabewert darf nicht null sein');
                }
            }
            else
            {
                require_once(
'CodEvo/Object/Exception.php');
                throw new 
CodEvo_Object_Exception('Die Callback-Funktion '$function .' der Variable '$key .' existiert nicht');
            }
        }
            
        switch (
strtolower($type))
        {
            case 
'int':
            case 
'integer':
                
$success is_int($value);
                break;
                    
            case 
'float':
            case 
'double':
                
$success = (is_float($value) || is_double($value));
                break;
                    
            case 
'bool':
            case 
'boolean':
                
$success is_bool($value);
                break;
                    
            case 
'string':
                
$success is_string($value);
                break;
                    
            case 
'array':
                
$success is_array($value);
                break;
                    
            case 
'resource':
                
$success is_resource($value);
                break;
                    
            case 
'object':
                
$success is_object($value);
                break;
                    
            case 
'mixed':
                
$success true;
                break;
                    
            default:
                
$success = ($value instanceof $type);
                break;
        }
            
        if (
$success)
        {
            
$this->$name $value;
        }
        else
        {
            require_once(
'CodEvo/Object/Exception.php');
            throw new 
CodEvo_Object_Exception('Die Variable '$key .' muss vom Typ '$type .' sein');
        }
    }
    else
    {
        require_once(
'CodEvo/Object/Exception.php');
        throw new 
CodEvo_Object_Exception('Die Variable '$key .' existiert nicht');
    }

__________________
Ich würde so gern die Welt verändern doch Gott gibt mir den Quellcode nicht.
Compiler sind wie Franzosen.. schnauzen einen immer nur an, wenn man ihre Sprache nich perfekt spricht.
Codercrush ist offline   Mit Zitat antworten
Alt 02.08.2011, 12:41  
Erfahrener Benutzer
 
Registriert seit: 30.07.2008
Beiträge: 1.169
PHP-Kenntnisse:
Fortgeschritten
xm22 sorgt für eine eindrucksvolle Atmosphärexm22 sorgt für eine eindrucksvolle Atmosphärexm22 sorgt für eine eindrucksvolle Atmosphäre
Standard

Ich find's, ehrlich gesagt, murksig. Du gibst Vorteile fest definierter und dokumentierbarer Funktionen auf und baust da eine riesen Funktion auf, die bei jeder Zuweisung durchlaufen wird - und alles nur, um sich ein paar Getter und Setter zu sparen?

Was ist denn, wenn Du mal bei einer Zuweisung eine Sonderbehandlung brauchst? Und kommt nicht sowieso mit PHP 5.4 das Type Hinting für skalare Werte?
xm22 ist offline   Mit Zitat antworten
Alt 02.08.2011, 13:00  
Benutzer
 
Registriert seit: 18.02.2010
Beiträge: 54
PHP-Kenntnisse:
Fortgeschritten
Codercrush ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Nicht nur um die Getter & Setter zu sparen sondern auch um eine Art Typisierung einzubauen. War oft das Problem wenn ein bestimmtes Objekt bzw Klasse als übergabeparameter festgelegt war und man ein anderes verwenden wollte bzw musste, dann musste man die komplette methode überschreiben oder es war sogar nicht möglich da es so im interface festgelegt war.

Für die Sonderbehandlung habe ich ja eine Callback-Funktion eingebaut in denn man wenn nötig auch seine eigene Set-Methode schreiben kann.
__________________
Ich würde so gern die Welt verändern doch Gott gibt mir den Quellcode nicht.
Compiler sind wie Franzosen.. schnauzen einen immer nur an, wenn man ihre Sprache nich perfekt spricht.
Codercrush ist offline   Mit Zitat antworten
Alt 02.08.2011, 13:03  
fab
Erfahrener Benutzer
 
Benutzerbild von fab
 
Registriert seit: 28.07.2010
Beiträge: 2.308
PHP-Kenntnisse:
Fortgeschritten
fab ist ein Lichtblickfab ist ein Lichtblickfab ist ein Lichtblickfab ist ein Lichtblickfab ist ein Lichtblick
Standard

Zitat:
Zitat von Codercrush Beitrag anzeigen
Nicht nur um die Getter & Setter zu sparen sondern auch um eine Art Typisierung einzubauen. War oft das Problem wenn ein bestimmtes Objekt bzw Klasse als übergabeparameter festgelegt war und man ein anderes verwenden wollte bzw musste, dann musste man die komplette methode überschreiben oder es war sogar nicht möglich da es so im interface festgelegt war.
Das klingt jetzt aber eher nach Design-Fehler. Bei sauberer OOP sollte es nicht nötig sein, Parametertypen in erbenden Klassen zu ändern.

Andersherum, wenn du als Ersatz fürs Überladen verschiedene Typen akzeptieren willst, mache dir die dynamische Natur von PHP zunutze und verzichte auf Type Hints.
fab ist offline   Mit Zitat antworten
Alt 02.08.2011, 13:07  
Benutzer
 
Registriert seit: 18.02.2010
Beiträge: 54
PHP-Kenntnisse:
Fortgeschritten
Codercrush ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Ok, also bleibe ich doch wohl bei den "normalen" Getter & Setter

Danke
__________________
Ich würde so gern die Welt verändern doch Gott gibt mir den Quellcode nicht.
Compiler sind wie Franzosen.. schnauzen einen immer nur an, wenn man ihre Sprache nich perfekt spricht.
Codercrush ist offline   Mit Zitat antworten
Alt 02.08.2011, 13:11  
Erfahrener Benutzer
 
Registriert seit: 30.07.2008
Beiträge: 1.169
PHP-Kenntnisse:
Fortgeschritten
xm22 sorgt für eine eindrucksvolle Atmosphärexm22 sorgt für eine eindrucksvolle Atmosphärexm22 sorgt für eine eindrucksvolle Atmosphäre
Standard

Zitat:
sondern auch um eine Art Typisierung einzubauen.
Zitat:
Und kommt nicht sowieso mit PHP 5.4 das Type Hinting für skalare Werte?

Dauert zwar noch etwas, aber trotzdem...
xm22 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
Implementierung vieler Getter bzw. Setter-Methoden axelf Software-Design 28 08.06.2011 17:10
Wiederkehrende Aufgaben (set, get, etc.) elf PHP Einsteiger 51 23.04.2011 21:04
Sinn und Zweck der Set und Get Methoden Kevni PHP Tipps 2010 10 09.09.2010 22:46
[Erledigt] Getter und statische Variable stayInside PHP Tipps 2009 0 27.01.2009 20:29

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php getter setter, php getter, php setter getter, php getter und setter, getter und setter php, php setter, php getter setter erstellen, getter setter php, getter und setter in php, setter und getter php, php 5.4 skalare type hints, getter setter in php, getter und setter in php?, getter setter, php objekte setter getter, php, getter for array, php 5.4 getter setter, getter setter array php, php \@method\ zend getter setter, warum getter und setter php

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