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 (1) Themen-Optionen Bewertung: Bewertung: 5 Stimmen, 5,00 durchschnittlich.
  1 links from elsewhere to this Post. Click to view. #1 (permalink)  
Alt 19-08-2009, 16:17
Apfelmus
 Registrierter Benutzer
Links : Onlinestatus : Apfelmus ist offline
Registriert seit: Aug 2009
Beiträge: 34
Apfelmus befindet sich auf einem aufstrebenden Ast
Standard 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.
Mit Zitat antworten
  #2 (permalink)  
Alt 19-08-2009, 16:28
unset
  Moderator
Links : Onlinestatus : unset ist offline
Registriert seit: Jan 2007
Ort: Düsseldorf
Beiträge: 3.782
unset befindet sich auf einem aufstrebenden Ast
Standard

Hatte dazu mal was gebloggt: It’s magic: Magische Methoden in PHP | Der PHP Hacker — Noch ein PHP Blog
Mit Zitat antworten
  #3 (permalink)  
Alt 19-08-2009, 20:18
Apfelmus
 Registrierter Benutzer
Links : Onlinestatus : Apfelmus ist offline
Registriert seit: Aug 2009
Beiträge: 34
Apfelmus befindet sich auf einem aufstrebenden Ast
Standard

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.
Mit Zitat antworten
  #4 (permalink)  
Alt 19-08-2009, 20:32
combie
 PHP Expert
Links : Onlinestatus : combie ist offline
Registriert seit: May 2006
Beiträge: 3.296
combie wird schon bald berühmt werden
Standard

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.
__________________
Wir werden alle sterben

Geändert von combie (19-08-2009 um 20:39 Uhr)
Mit Zitat antworten
  #5 (permalink)  
Alt 19-08-2009, 23:04
Benutzerbild von onemorenerd onemorenerd
  Moderator
Links : Onlinestatus : onemorenerd ist offline
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.471
onemorenerd wird schon bald berühmt werdenonemorenerd wird schon bald berühmt werden
Standard

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.
Mit Zitat antworten
  #6 (permalink)  
Alt 19-08-2009, 23:32
combie
 PHP Expert
Links : Onlinestatus : combie ist offline
Registriert seit: May 2006
Beiträge: 3.296
combie wird schon bald berühmt werden
Standard

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!




?>
__________________
Wir werden alle sterben

Geändert von combie (19-08-2009 um 23:50 Uhr)
Mit Zitat antworten
  #7 (permalink)  
Alt 21-08-2009, 23:05
Apfelmus
 Registrierter Benutzer
Links : Onlinestatus : Apfelmus ist offline
Registriert seit: Aug 2009
Beiträge: 34
Apfelmus befindet sich auf einem aufstrebenden Ast
Standard

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 !
Mit Zitat antworten
  #8 (permalink)  
Alt 21-08-2009, 23:44
AmicaNoctis
  Moderatorin
Links : Onlinestatus : AmicaNoctis ist offline
Registriert seit: Jul 2009
Beiträge: 5.709
Blog-Einträge: 9
AmicaNoctis sorgt für eine eindrucksvolle AtmosphäreAmicaNoctis sorgt für eine eindrucksvolle Atmosphäre
Standard

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 Beitrag anzeigen
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 (21-08-2009 um 23:49 Uhr)
Mit Zitat antworten
  #9 (permalink)  
Alt 21-08-2009, 23:46
PHP-Desaster
 PHP Expert
Links : Onlinestatus : PHP-Desaster ist offline
Registriert seit: Mar 2006
Beiträge: 3.105
PHP-Desaster befindet sich auf einem aufstrebenden Ast
Standard

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.
Mit Zitat antworten
  #10 (permalink)  
Alt 22-08-2009, 00:22
wahsaga
  Moderator
Links : Onlinestatus : wahsaga ist offline
Registriert seit: Sep 2001
Beiträge: 25.236
wahsaga befindet sich auf einem aufstrebenden Ast
Standard

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.
Mit Zitat antworten
  #11 (permalink)  
Alt 22-08-2009, 01:15
goth
  Moderator
Links : Onlinestatus : goth ist offline
Registriert seit: Mar 2002
Ort: Erde
Beiträge: 7.271
goth ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Zitat von AmicaNoctis Beitrag anzeigen
... 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!
Mit Zitat antworten
  #12 (permalink)  
Alt 22-08-2009, 01:35
Apfelmus
 Registrierter Benutzer
Links : Onlinestatus : Apfelmus ist offline
Registriert seit: Aug 2009
Beiträge: 34
Apfelmus befindet sich auf einem aufstrebenden Ast
Standard

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 ?




Mit Zitat antworten
  #13 (permalink)  
Alt 22-08-2009, 01:47
wahsaga
  Moderator
Links : Onlinestatus : wahsaga ist offline
Registriert seit: Sep 2001
Beiträge: 25.236
wahsaga befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von Apfelmus Beitrag anzeigen
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.
Mit Zitat antworten
  #14 (permalink)  
Alt 22-08-2009, 03:20
Apfelmus
 Registrierter Benutzer
Links : Onlinestatus : Apfelmus ist offline
Registriert seit: Aug 2009
Beiträge: 34
Apfelmus befindet sich auf einem aufstrebenden Ast
Standard

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 ?
Mit Zitat antworten
  #15 (permalink)  
Alt 22-08-2009, 03:57
wahsaga
  Moderator
Links : Onlinestatus : wahsaga ist offline
Registriert seit: Sep 2001
Beiträge: 25.236
wahsaga befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von Apfelmus Beitrag anzeigen
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.
Mit Zitat antworten
Antwort

Lesezeichen


LinkBacks (?)
LinkBack to this Thread: https://www.php-resource.de/forum/php-developer-forum/97331-getter-und-setter-erklaerung-gesucht.html
Erstellt von For Type Datum
MetaGer, Suche nach: finktion von getter und setter This thread Refback 20-02-2014 10:38

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

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Sprachkenner mit get und setter bearbeiten der_meier_hans PHP Developer Forum 3 14-06-2009 20:40
Setter/Getter in PHP 5.1 - verwendet IHR diese? StarShaper PHP Developer Forum 4 23-01-2006 21:17
Erklärung? lollo PHP Developer Forum 9 16-07-2004 10:10
erklärung nötig ox[y]gen PHP Developer Forum 1 25-08-2003 09:01
Bitte um Erklärung ... Wurzel PHP Developer Forum 3 17-01-2003 13:03

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

PHP Server Monitor

PHP Server Monitor ist ein Skript, das prüft, ob Ihre Websites und Server betriebsbereit sind.

11.09.2018 Berni | Kategorie: PHP/ Security
PHP WEB STATISTIK ansehen PHP WEB STATISTIK

Die PHP Web Statistik bietet Ihnen ein einfach zu konfigurierendes Script zur Aufzeichnung und grafischen und textuellen Auswertung der Besuchern Ihrer Webseite. Folgende zeitlichen Module sind verfügbar: Jahr, Monat, Tag, Wochentag, Stunde Folgende son

28.08.2018 phpwebstat | Kategorie: PHP/ Counter
Affilinator - Affilinet XML Produktlisten Skript

Die Affilinator Affilinet XML Edition ist ein vollautomatisches Skript zum einlesen und darstellen der Affili.net (Partnerprogramm Netzwerk) Produktlisten und Produktdaten. Im Grunde gibt der Webmaster seine Affilinet PartnerID ein und hat dann unmittelb

27.08.2018 freefrank@ | Kategorie: PHP/ Partnerprogramme
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 12:08 Uhr.