Impressum · Kontakt · Hilfe
Besucher online · Mitglieder



Portal > Foren > PHP > PHP-Programmierung > Datentyp von Objekteigenschaften festlegen, eine Variante mit __get()/__set()
Antwort
 
Themen-Optionen
Alt 29.05.2006, 17:05   Nach oben    #1
Ben
Erfahrener Benutzer
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.619
Standard Datentyp von Objekteigenschaften festlegen, eine Variante mit __get()/__set()

Hallo,
da PHP typenlos ist, ist es ja jederzeit möglich einen String zu einem boolean und danach zu einem Integer zu machen.

Beim Studium meines neuen Buches bin ich gerade beim Kapitel 2.27, Überladen angekommen.

Dort wird ein netter Workaround für obigen Mangel, wenn man es denn so bezeichnen möchte, dargestellt.

Hier mal der Code.
PHP-Code:
<?php

error_reporting
(E_ALL);

class 
Typed {
    
    private 
$properties = array();
    static 
$types = array('counter' => 'is_integer',
                          
'name'    => 'is_string');
        
                          
    public function 
__get($name) {
        if(
array_key_exists($name$this->properties)) {
            return 
$this->properties[$name];
        }
    }    
    
    
    public function 
__set($name$value) {
        if(
array_key_exists($nameself::$types)) {
            if(
call_user_func(self::$types[$name], $value)) {
                
$this->properties[$name] = $value;
            }
            else {
                echo 
'Type assignment error <br />';
                
debug_print_backtrace();
            }
        }        
    }
}

$obj = new Typed();
$obj->name    'Ben';
$obj->counter 1;

echo 
'<pre>';
var_dump($obj);
echo 
'</pre>';

$obj->name    true;

?>
Die Ausgabe dieses Quelltextes ist:
Code:
object(Typed)#1 (1) {
  ["properties:private"]=>
  array(2) {
    ["name"]=>
    string(3) "Ben"
    ["counter"]=>
    int(1)
  }
}

Type assignment error
#0 Typed::__set(name, 1) called at [C:\apachefriends\xampp\htdocs\dev\buch\overloading.php:41]
Ich bin selbst ein absoluter Laie, was die Verwendung von __get()/__set() angeht und bin trotz dieses netten Schnipsel kein Freund davon. Jedenfalls derzeit noch nicht .. wer weiß, was das Buch noch so bringt.
Auf jeden Fall wollte ich Euch das hier nicht vorenthalten, weil ich es irgendwie recht nett finde, für diejenigen, die sowieso mit __get()/__set() arbeiten.

Ich persönlich werde es nicht nutzen, weil ich halt lieber den "klassischen" Weg über setter/getter gehe à la
PHP-Code:
public function setName($name) {
    if(
is_string($name)) {
        
$this->name $name;
    }
    else {
        throw new 
BlubbException();
    }

Wie gesagt. Vielleicht ist es ja interessant für den ein oder anderen User hier.

Grüße, Ben.
Ben ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 31.05.2006, 04:34   Nach oben    #2
KingCrunch
Neuer Benutzer
 
Registriert seit: 31.05.2006
Beiträge: 24
Standard

MoinIch selbst bin ja schon ein Fan der "magischen Methoden". Im Großen und Ganzen arbeite ich aber auch bevorzugt über setter/getter, wobei es auch Situationen gibt, bei denen direkte Wertzuweisung durchaus Sinn ergibt. Mir fällt bloss grad keiner ein....Die Methoden __set und __get haben allerdings das Objekt als solches zu behandeln (und nicht die Eigenschaften durch setter/geter auszuklammern) und dabei trotzdem noch Typ-/Variablenprüfung vorzunehmen. Ursprünglich sollten die Eigenschaften ja auf eben die direkte Art und Weise angesprochen werden. __set und __get erlauben eben noch zusätzlich trotzdem Typ und semantische Integrität zu prüfen!
KingCrunch ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 02.06.2006, 16:59   Nach oben    #3
Jay
Gast
 
Beiträge: n/a
Standard

__call __get das ist hauptsächlich für dynamische Eigenschaften gedacht.

zB:
PHP-Code:

class Test {

   private 
$properties = array ();

   function 
add ($key$val) {$this->properties[$key]=$val;}

   function 
__call ($name) {
   
       return 
$this->properties[substr ($name0,3)];
   }

}

$obj = new Test ();
$obj->add ("Setting1""setting1");

echo 
$obj->getSetting1 (); 
 
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Antwort

Lesezeichen


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

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 Aus


Alle Zeitangaben in WEZ +2. Es ist jetzt 20:15 Uhr.

Nach oben
Wir nutzen das Zend Framework, vBulletin (vBulletin v3.7.3, Copyright ©2000-2008, Jelsoft Enterprises Ltd.
SEO by vBSEO 3.0.0) und vBSEO.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44