php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > PHP Developer Forum
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Fragen zu Laravel, YII oder anderen PHP-Frameworks.

Antwort
 
LinkBack Themen-Optionen Bewertung: Bewertung: 1 Stimmen, 5,00 durchschnittlich.
  #1 (permalink)  
Alt 17-07-2012, 17:36
einermeiner
 Registrierter Benutzer
Links : Onlinestatus : einermeiner ist offline
Registriert seit: Jun 2009
Beiträge: 132
einermeiner befindet sich auf einem aufstrebenden Ast
Standard generelle Datenkapselung sinnvoll?

Gibt es praktische Gründe, die für eine generelle Datenkapselung sprechen (keine public Attribute, immer setter und getter)?
Wenn beim Setzen des Attributes weitere Aktionen ausgeführt werden sollen oder beim Lesen bspw. dynamisch etwas zurückgegeben werden soll, dann macht Datenkapselung natürlich Sinn.
Aber warum auch andere Variablen, deren getter / setter wie im folgenden aufgebaut sind, kapseln?
PHP-Code:
class c
{
private 
$a;
public function 
getA()
{
return 
$this->a;
}
public function 
setA($value)
{
$this->a=$value;
}

Auch das Argument, dass bei anfänglicher Planung keine weiteren Aktionen beim Setzen / Lesen ausgeführt werden sollen und dann nachträglich doch noch eine setter Methode benötigt wird, lässt sich dadurch entkräften, dass man über __get() und __set() diese auch noch nachträglich hinzufügen kann in einer abgeleiteten Klasse z.B.
Der durch die magischen Methoden entstehende Performance-Verlust lässt sich vermutlich durch das Einsparen der vielen get / set Methoden kompensieren.

Sind da Gründe für eine generelle Datenkapselung, die ich nicht kenne?
Mit Zitat antworten
  #2 (permalink)  
Alt 17-07-2012, 18:02
Benutzerbild von ApoY2k ApoY2k
 Registrierter Benutzer
Links : Onlinestatus : ApoY2k ist offline
Registriert seit: Nov 2006
Beiträge: 359
ApoY2k befindet sich auf einem aufstrebenden Ast
ApoY2k eine Nachricht über ICQ schicken ApoY2k eine Nachricht über Skype™ schicken
Standard

Manche Sprachen unterstützen sachen wie "readonly" Felder nicht. Einzige Möglichkeit: nur einen getter definieren und das tatsächliche Attribut verstecken.

Ansonsten hat man in PHP mit den von dir erwähnten Konstrukten schon sehr gutes Werkzeug an der Hand.

Hat man aber eben nicht überall, und das muss man bedenken.
__________________
This is what happens when an unstoppable force meets an immovable object.
Mit Zitat antworten
  #3 (permalink)  
Alt 18-07-2012, 18:23
Benutzerbild von mermshaus mermshaus
 Registrierter Benutzer
Links : Onlinestatus : mermshaus ist offline
Registriert seit: Jun 2009
Beiträge: 451
mermshaus wird schon bald berühmt werden
Standard

Der Hauptgrund für Datenkapselung ist sicherlich die Kontrolle von Eingabewerten. Eine Instanz einer Klasse – ein Objekt – sollte in der Regel dafür sorgen, dass es sich immer in einem gültigen Zustand befindet. Das ist sicherlich einer der Hauptzwecke von OOP.

PHP-Code:
class Person
{
    public 
$name 'Dummy';
}

$p = new Person();
$p->name = -12.7
Hier ist es möglich, $p sinnlose Werte zu setzen und das Objekt in einen ungültigen Zustand zu bringen.

Zitat:
Zitat von einermeiner
Auch das Argument, dass bei anfänglicher Planung keine weiteren Aktionen beim Setzen / Lesen ausgeführt werden sollen und dann nachträglich doch noch eine setter Methode benötigt wird, lässt sich dadurch entkräften, dass man über __get() und __set() diese auch noch nachträglich hinzufügen kann in einer abgeleiteten Klasse z.B.
Das geht meines Wissens nicht.

PHP-Code:
class Foo
{
    public 
$bar;
}

class 
Baz extends Foo
{
    protected 
$boz;

    public function 
__get($name)
    {
        
printf(
            
"%s::%s called for %s\n",
            
__CLASS____FUNCTION__$name
        
);
    }

    public function 
__set($name$value)
    {
        
printf(
            
"%s::%s called for %s\n",
            
__CLASS____FUNCTION__$name
        
);
    }
}

$b = new Baz();

// No output
$b->bar;
$b->bar '';

// Output
$b->boz;
$b->boz ''
Beim Einsatz von magischen Methoden besteht zudem immer das Problem, dass Teile des API einer Klasse verdeckt werden. Es wird sehr schwierig oder sogar unmöglich, festzustellen, welche öffentlichen Instanzvariablen eine Klasse denn nun hat.
Mit Zitat antworten
  #4 (permalink)  
Alt 19-07-2012, 15:20
einermeiner
 Registrierter Benutzer
Links : Onlinestatus : einermeiner ist offline
Registriert seit: Jun 2009
Beiträge: 132
einermeiner befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Das geht meines Wissens nicht.
Stimmt, ich hatte nicht daran gedacht, dass die abgeleitete Klasse mindestens die gleiche Sichtbarkeit wie die Elternklasse haben muss.

Das von mir verwendete Framework arbeitet allerdings häufig mit den magischen Methoden...
Mit Zitat antworten
  #5 (permalink)  
Alt 20-07-2012, 01:28
Benutzerbild von mermshaus mermshaus
 Registrierter Benutzer
Links : Onlinestatus : mermshaus ist offline
Registriert seit: Jun 2009
Beiträge: 451
mermshaus wird schon bald berühmt werden
Standard

Ich glaube, der Aspekt ist hier eher Willkür aka Designentscheidung.

- PHP: Overloading - Manual

Zitat:
__set() is run when writing data to inaccessible properties.

__get() is utilized for reading data from inaccessible properties.
Öffentliche Instanzvariablen sind nicht inaccessible genug.


Ich denke, __get und __set sind möglicherweise akzeptabel, wenn die Klasse ein generischer Container ist, der sonst so funktionieren würde:

PHP-Code:
$c->set('key'$value);
$c->get('key'); 
Hier wird eine beliebige Anzahl von „Instanzvariablen“ verwaltet.

Vier Unterstriche mehr im Klassencode und es wird zu:

PHP-Code:
$c->key $value;
$c->key
Weiß nicht, über solche Fragen habe ich bisher noch nie besonders intensiv nachgedacht. Es spart schon Tipparbeit, nicht immer get('') hinzufügen zu müssen. Convenience shortcuts sind wichtig. Das klassische Beispiel für magische Getter sind sicherlich View-Klassen mit Template-Scripts im Stile von Zend_View.

PHP-Code:
$view->foo 'Hello World'
PHP-Code:
<p><?=$this->foo?></p>
Mit Zitat antworten
  #6 (permalink)  
Alt 20-07-2012, 20:17
einermeiner
 Registrierter Benutzer
Links : Onlinestatus : einermeiner ist offline
Registriert seit: Jun 2009
Beiträge: 132
einermeiner befindet sich auf einem aufstrebenden Ast
Standard

Im Yii-Framework ist dies auch die Vorgehensweise beim Eintragen von Daten in das Model, die Validierung findet über eine Methode validate(), die aber separat aufgerufen werden muss.
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Generelle Frage Zipper5004 Projekthilfe 12 16-12-2007 23:42
datenkapselung in php BugBite PHP Developer Forum 4 06-04-2007 21:21
generelle frage zu imagedestroy() Magic11 PHP Developer Forum 3 31-03-2006 13:27
Generelle Anfängerfragen dyter07 PHP Developer Forum 3 11-02-2006 14:10
Zeit! (generelle Frage) DuncanMcLord PHP Developer Forum 2 03-09-2001 00:45

Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre 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


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

ADSMAN V3 - Werbe-Manager ansehen ADSMAN V3 - Werbe-Manager

ADSMAN V3 - mehr als nur ein Bannermanager! Banner, Textanzeigen und PagePeel Manager! Mit ADSMAN PRO haben Sie die Marketinglösung für eine effektive und effiziente Werbeschaltung mit messbaren Ergebnissen. Unterstützt werden Bannerformate in beliebi

25.10.2018 virtualsystem | Kategorie: PHP/ Bannerverwaltung
PHP News und Artikel Script V2

News schreiben, verwalten, veröffentlichen. Dies ist jetzt mit dem neuen PHP News & Artikel System von virtualsystem.de noch einfacher. Die integrierte Multi-User-Funktion und der WYSIWYG-Editor (MS-Office ähnliche Bedienung) ermöglichen...

25.10.2018 virtualsystem | Kategorie: PHP/ News
Top-Side Guestbook

Gästebuch auf Textbasis (kein MySQL nötig) mit Smilies, Ip Sperre (Zeit selbst einstellbar), Spamschutz, Captcha (Code-Eingabe), BB-Code, Hitcounter, Löschfunktion, Editierfunktion, Kommentarfunktion, Kürzung langer Wörter, Seiten- bzw. Blätterfunktion, V

22.10.2018 webmaster10 | Kategorie: PHP/ Gaestebuch
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 03:53 Uhr.