| 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! Post your PHP questions here! |
 |
|

19-08-2009, 17:17
|
|
Apfelmus
Registrierter Benutzer
|
|
Registriert seit: Aug 2009
Beiträge: 34
|
|
getter und Setter erklärung gesucht
Hallo Leute, versuche grade php zu lernen.
kann mir jemand erklären was sind __get() und __set() methoden?
Also meine Recherche ergab:
Es gibt 2 Arten von get/set Methoden.
1)kann man selber schreiben
2) und die 2te muss man die bestehenden verwenden. __get() __set()
Nur kann ich bei keinem der beiden einen Mehrwert erkennen für was die gut sein sollte?
Kann mir das jemand erklären für was die gut sein sollte?
Oder einen Link auf eine Info Quelle die das gut erklärt? Mit einem guten Beispiel ?
Vielen `Dank im Voraus.
|

19-08-2009, 17:28
|
unset
 Moderator
|
|
Registriert seit: Jan 2007
Ort: Düsseldorf
Beiträge: 3.769
|
|
|

19-08-2009, 21:18
|
|
Apfelmus
Registrierter Benutzer
|
|
Registriert seit: Aug 2009
Beiträge: 34
|
|
Vielen dank für den Link.
Bin schwer von Begriff: z.B. die __set() Methode wird gebraucht wenn etwas Dynamisch geladen wird. Bzw. wenn eine Classe Dynamisch um einige Eigenschaften erweitert wird.
Aber bei welchen Szenarien Trifft das z.B. zu?
Hab versucht hier was zu schreiben leider verschte ich nicht wie es funktioniert bzw. wozu __set() da ist.
PHP-Code:
<?php /* * To change this template, choose Tools | Templates * and open the template in the editor. */
/** * Description of getSet * * @author Administrator */ class Webseite{
public $pagerank; public $alexa; public $archive;
// die muss ich implementieren ? public $nichtbekannt;
public function __construct($pagerank,$alexa,$archive){
$this->pagerank = $pagerank; $this->alexa = $alexa; $this->archive = $archive;
}
public function __set($eigenschaft,$value){
$this->nichtbekannt = $value; } // was ich nicht verstehen kann hier kommt nichts ? // warum nichts ?
}
$meineSeite = new Webseite('4','6905','2005');
$meineSeite->sichtindex ='23'; // versuche eine Variable/Eigenschaft zuweisen die es nicht gibt print "was habe ich hier uebergeben ?\n "; print "--: {$meineSeite->alexa}\n"; print "--:{$meineSeite->pagerank}\n"; print "--:{$meineSeite->archive}\n"; print "--:{$meineSeite->sichtindex}\n"; // Versuche diese hier auszugeben leider nein, und ich wiss nicht warum ?
?>
kann mir jemand helfen die get und set variablen zu verstehen helfen ?
danke im Voraus.
|

19-08-2009, 21:32
|
|
combie
PHP Expert
|
|
Registriert seit: May 2006
Beiträge: 2.865
|
|
Meines Erachtens macht die Verwendung von __set und __get wenig/selten Sinn.
1. lassen sie sich schlecht dokumentieren
2. Die Autovervollständigung der großen Editoren bleiben auf der Strecke
Also, wann machts Sinn?
Nur dann, wenn man die gewünschten Eigenschaften der Klasse nicht kennt, wärend man die Klasse schreibt.
Das ist z.B. der Fall, wenn man das Registry oder Dependency Injection Pattern implementiert. Oder evtl. auch in einem ORM.
Geändert von combie (19-08-2009 um 21:39 Uhr)
|

20-08-2009, 00:04
|
 |
onemorenerd
 Moderator
|
|
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.481
|
|
Magische Getter und Setter können in Basisklassen sicher stellen, dass Ableitungen bestimmte Methoden implementieren oder sonst einheitliche Fehler geworfen werden. Bestimmte Methoden heißt in diesem Fall eben Getter und Setter für die Membervariablen, die in der Ableitung definiert sind.
|

20-08-2009, 00:32
|
|
combie
PHP Expert
|
|
Registriert seit: May 2006
Beiträge: 2.865
|
|
PHP-Code:
<?php
error_reporting(-1);
ini_set('display_errors', TRUE);
class Webseite
{
protected $pagerank;
protected $alexa;
protected $archive;
protected $nichtbekannt = array(); // ein Container für user Eigenschaften
public function __construct($pagerank,$alexa,$archive)
{
$this->pagerank = $pagerank;
$this->alexa = $alexa;
$this->archive = $archive;
}
public function __set($eigenschaft,$value)
{
$this->nichtbekannt[$eigenschaft] = $value;
}
public function __get($eigenschaft)
{
if(!isset($this->nichtbekannt[$eigenschaft])) // null gilt als nicht gesetzt
throw new Exception("Die Eigenschaft $eigenschaft ist nicht gesetzt");
return $this->nichtbekannt[$eigenschaft];
}
}
$meineSeite = new Webseite('4','6905','2005');
$meineSeite->sichtindex ='23'; // versuche eine Variable/Eigenschaft zuweisen die es nicht gibt
print "was habe ich hier uebergeben ?<br>\n ";
print "--:{$meineSeite->alexa}<br>\n";
print "--:{$meineSeite->pagerank}<br>\n";
print "--:{$meineSeite->archive}<br>\n";
print "--:{$meineSeite->sichtindex}<br>\n"; // Versuche diese hier auszugeben und tuts!
print "--:{$meineSeite->traritratra}<br>\n"; // wirft Exception!
?>
Geändert von combie (20-08-2009 um 00:50 Uhr)
|

22-08-2009, 00:05
|
|
Apfelmus
Registrierter Benutzer
|
|
Registriert seit: Aug 2009
Beiträge: 34
|
|
Vielen Dank für die Antworten die es hier gegeben hat.
Leider ist es für mich immer noch nicht verständlich.
Der Code von combie hat einen Fehler, gemeint ist nicht die Exception.
@combie die Aussage von Oben habe ich schon mal gelesen, in einem Anderen Forum. ;-)
@onemorenerd = nicht falsch verstehen -> Leider ist die Antwort für mich viel zu schlau. erhlich ich habe nur ein teil verstanden.
kannst du eine Reelle Anwendungs-Möglichkeit geben ?
Da ich immer noch da bin wo ich war. Alleine die aussage von Combie hat etwas Licht in dunkelheit gebracht
Zitat:
Meines Erachtens macht die Verwendung von __set und __get wenig/selten Sinn.
Nur dann, wenn man die gewünschten Eigenschaften der Klasse nicht kennt, während man die Klasse schreibt.
|
wie kann ich eine Klasse Schreiben die ich nicht kenne ? Absurd !
Wo ist hier bei der __get() und __set() Methode die Logik?!
Der Code von Unten kommt ( fast genau so wie er ist ) aus dem PHP Pear Buch von Carsten Möhrke!
( Modifiziert durch mich ) Zahl eingebracht und die ausgabe mit print_r verdeutlicht.
PHP-Code:
<?php
class Setter {
private $data;
public function __set($name, $value) {
$value = $value +5; $this->data[$name]=$value; }
public function __get($name){
return $this->data[$name]; } }
$meinObject = new Setter();
$meinObject->eigenschaft= '10';
echo $meinObject->eigenschaft;
print_r($meinObject); ?>
Der Code Spukt folgendes aus.
PHP-Code:
15Setter Object ( [data:rivate] => Array ( [eigenschaft] => 15 ) )
Die Addition habe ich eingebracht um zu sehen ob die Funktion auch in Gebrauch genommen wird.
Und wie man sehen kann Sie wird gebraucht.
Aber der Code hier :
PHP-Code:
<?php
class Setter {
private $data;
}
$meinObject = new Setter();
$meinObject->eigenschaft= '10';
echo $meinObject->eigenschaft;
print_r($meinObject); ?>
Gibt folgendes aus:
PHP-Code:
10Setter Object ( [data:rivate] => [eigenschaft] => 10 )
Sprich das Objekt hat auch die Eigenschaft die ich nicht deklariert habe ?
Wozu dann die __set() und __get()
Was habe ich falsch verstanden?
Bitte um Hilfe !
|

22-08-2009, 00:44
|
AmicaNoctis
 Moderatorin
|
|
Registriert seit: Jul 2009
Ort: Dresden
Beiträge: 5.463
|
|
Ok, dann versuch ich es nochmal. Magische Getter und Setter bieten ein paar relevante Vorteile, die man zwar nie dringend braucht, die aber das Programmieren netter machen können. Dennoch haben sie auch Nachteile (wie bereits erwähnt).
Zitat:
Zitat von Apfelmus
wie kann ich eine Klasse Schreiben die ich nicht kenne ? Absurd !
|
Siehe Punkt 3.
1. Man kann sie einfach ansprechen, als wären es öffentliche Membervariablen. Statt $objekt->getSonstwas() schreibt man einfach $objekt->sonstwas.
2. Man kann Getter ohne zugehörige Setter implementieren, was den einzigen Weg darstellt, in PHP schreibgeschützte Properties umzusetzen.
3. Man kann sie sozusagen zur Laufzeit erzeugen. Das macht z. B. Sinn, wenn man Datenformate mit einer Klasse abbilden will, deren Eigenschaften nicht von vornherein feststehen. Z. B. INI-Dateien. Eine Klasse kann in so einem magischen Getter entscheiden, ob es in der INI-Datei eine Eigenschaft dieses Namens gibt und im Erfolgsfall den Wert zurückliefern. Mit normalen Membervariablen ließe sich das nur lösen, wenn die INI-Datei ein ganz bestimmtes Format besitzt, das immer die gleichen Eigenschaften enthält.
4. Wenn man mit Exceptions arbeitet, kann man beim unerlaubten Zugriff auf magische Eigenschaften selbige werfen. Der Zugriff auf private oder gar nicht vorhandene Membervariablen dagegen erzeugt nur PHP Errors/Warnings, die man erst mit benutzerdefinierten Errorhandlers wieder zu Exceptions machen müsste.
Ohne magische Getter und Setter entstehen Methoden wie getProperty($pName) und setProperty($pName, $pValue). In diesem Punkt muss ich combie widersprechen. Für Dokumentation und Autovervollständigung haben magische Getter und Setter in diesem Fall keine entscheidenden Nachteile, denn die Alternative (getProperty und setProperty) würde auch nichts über die verfügbaren Eigenschaften aussagen.
Bei Fragen, fragen.
Gruß,
Anja
Geändert von AmicaNoctis (22-08-2009 um 00:49 Uhr)
|

22-08-2009, 00:46
|
|
PHP-Desaster
PHP Expert
|
|
Registriert seit: Mar 2006
Beiträge: 3.104
|
|
Für solche Array-Wrapper sind die Dinger ziemlich banal. Guck dir für eine recht interessante doch mal das Feed-Package im Zend Framework an. Da wird viel mit den magischen Methoden gearbeitet, um auf Attribute und Inhalte zuzugreifen. Ob man das umbedingt so machen sollte ist eine andere Frage, aber da sieht du etwas mehr implementation.
|

22-08-2009, 01:22
|
wahsaga
 Moderator
|
|
Registriert seit: Sep 2001
Beiträge: 24.455
|
|
OffTopic: Off-topic abgetrennt - wer's weiterführen möchte, bitte hier entlang: http://www.php-resource.de/forum/out...ch-boerse.html :-)
Hier jetzt bitte wieder on-topic diskutieren, Danke.
__________________
I don't believe in rebirth. Actually, I never did in my whole lives.
|

22-08-2009, 02:15
|
goth
 Moderator
|
|
Registriert seit: Mar 2002
Ort: Erde
Beiträge: 7.241
|
|
Zitat:
Zitat von AmicaNoctis
... In diesem Punkt muss ich combie widersprechen. Für Dokumentation und Autovervollständigung haben magische Getter und Setter in diesem Fall keine entscheidenden Nachteile, denn die Alternative (getProperty und setProperty) würde auch nichts über die verfügbaren Eigenschaften aussagen.
|
Wenn die vom Prinzip her anonymen Getter und Setter Methoden keinen Nachteil haben, hätten die gängigen IDE's wohl kaum so viele Probleme damit solche Properties in Autovervollständigungs Funktionen zu berücksichtigen.
Das ZendEngine Entwicklerteam geht leider nicht sehr häufig den guten und vernünfigen weg. Aus diesem Grunde ist PHP eben etwas defizitärer als andere Sprachen. (siehe auch fehlenden finally Block bei Exceptions.)
Ich hätte seinerzeit einen Ansatz wie bei Delphi bevorzugt ... weil man dort zum einen eine Aussage über das Property (Für IDE's) als auch eine schönere vom OO Paradigma geforderte Kapselung erreicht hätte ... aber wer hört schon auf mich ...  .
__________________
carpe noctem
Bitte keine Fragen per EMail ... im Forum haben alle was davon ... und ich beantworte EMail-Fragen von Foren-Mitgliedern in der Regel eh nicht!
Hinweis: Ich bin weder Mitglied noch Angestellter von ebiz-consult! Alles was ich hier von mir gebe tue ich in eigener Verantwortung!
http://www.mysqldiff.org
|

22-08-2009, 02:35
|
|
Apfelmus
Registrierter Benutzer
|
|
Registriert seit: Aug 2009
Beiträge: 34
|
|
Super ! danke! Auch wenn es nicht logisch ist!
ich glaube ich muss von anfang das verstehen bzw. ich kapiere es nicht!
Zitat:
1. Man kann sie einfach ansprechen, als wären es öffentliche Membervariablen. Statt $objekt->getSonstwas() schreibt man einfach $objekt->sonstwas.
2. Man kann Getter ohne zugehörige Setter implementieren, was den einzigen Weg darstellt, in PHP schreibgeschützte Properties umzusetzen.
|
Das kann ich auch so !
PHP-Code:
<?php
class Setter {
private $data;
}
$meinObject = new Setter();
$meinObject->eigenschaft= '10';
echo $meinObject->eigenschaft;
print_r($meinObject); ?>
Das geht doch? ein Objekt hat die Eigenschaft (Eigenschaft) mit dem Wert 10 !
Und das ohne get() und set() ?
Grundlegend verstehe ich nicht folgendes!
die Funktion hier Zend Framework: Documentation ist Statisch also sind get und Set überflüssig?
die Eigenschaft myUpdated ist Statisch!
wenn es Dynamisch wäre dann würde ich set und get als Nutzlich einsehen!
was übersehe ich -> ich muss was übersehen nur kapiere ich nicht was ?
|

22-08-2009, 02:47
|
wahsaga
 Moderator
|
|
Registriert seit: Sep 2001
Beiträge: 24.455
|
|
Zitat:
Zitat von Apfelmus
Das geht doch? ein Objekt hat die Eigenschaft (Eigenschaft) mit dem Wert 10 !
Und das ohne get() und set() ?
|
Du hast in dem, was du davor zitiert hast, das "als wären es öffentliche Membervariablen" überlesen.
__________________
I don't believe in rebirth. Actually, I never did in my whole lives.
|

22-08-2009, 04:20
|
|
Apfelmus
Registrierter Benutzer
|
|
Registriert seit: Aug 2009
Beiträge: 34
|
|
ich glaube ich übersehe ich was richtig banales !
den wie ich geschrieben habe kann ich auch ohne get und set auskommen.
also sind die Überflüsig?
kann niemand ein Beispiel geben welcher einfach und Logisch ist ?
|

22-08-2009, 04:57
|
wahsaga
 Moderator
|
|
Registriert seit: Sep 2001
Beiträge: 24.455
|
|
Zitat:
Zitat von Apfelmus
den wie ich geschrieben habe kann ich auch ohne get und set auskommen.
|
Ja - bei Membern, die public, öffentlich sind.
Und wie sieht das jetzt aus, wenn du die Membervariable als privat deklarierst ...?
__________________
I don't believe in rebirth. Actually, I never did in my whole lives.
|
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
|
| Themen-Optionen |
|
|
| 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.
HTML-Code ist aus.
|
|
|
|
PHP News
|