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 Bewertung: Bewertung: 1 Stimmen, 5,00 durchschnittlich.
Alt 30.05.2011, 16:05  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.994
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Zitat:
Properties als Strings abfragen?! Nicht schön.
Geht ja nun nicht anders. __call liefert den Methodennamen, __get den Propertynamen als String. Wonach sollst Du sonst handeln. Ob Du das nun im switch bedienst oder gleich als Arrayschlüssel benutzt ist doch reine Geschmackssache.
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

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

Alt 31.05.2011, 11:59  
Erfahrener Benutzer
 
Registriert seit: 02.09.2009
Beiträge: 1.020
PHP-Kenntnisse:
Fortgeschritten
mquadrat befindet sich auf einem aufstrebenden Ast
Standard

Im Switch muss man es explizit nochmal tippen. Also eine Fehlerquelle mehr, bzw. etwas an das man beim Refactoren denken muss, wenn man den Namen der Property anpasst. Mein Geschmack sagt: Je weniger Fehlerquellen, desto besser
__________________
Wir suchen PHP Entwickler (Vollzeit) im Raum Darmstadt / Rhein-Main. Infos via E-Mail mueller@new-frontiers.de
mquadrat ist offline   Mit Zitat antworten
Alt 07.06.2011, 09:32  
Benutzer
 
Registriert seit: 16.07.2010
Beiträge: 80
PHP-Kenntnisse:
Fortgeschritten
SinnlosS befindet sich auf einem aufstrebenden Ast
Standard

Wie ich gestern festgestellt habe, muss man bei Verwendung der __get-Methode vorsichtig sein. Bei Nutzung von Eigenschaften in Methoden die Referenzen erwarten werden diese Referenzen nicht auf die Objekt-Eigenschaft gelegt wenn die Eigenschaft über __get geholt wird:
PHP-Code:
<?php
error_reporting
(E_ALL E_STRICT);
class 
foo {
    protected 
$bar;
    
    public function 
__construct() {
        
$this->bar "Hallo Welt!";
    }
    public function 
__get($property) {
        if(!
property_exists($this,$property)) {
            throw new 
InvalidArgumentException("Property {$property} doesn't exist");
        }
        return 
$this->$property;
    }
    public function 
setBar($value) {
        
$this->bar $value;
    }
}
    
$foo = new foo();
    echo 
$foo->bar;    // Ausgabe: Hallo Welt!
    
$db = new mysqli("localhost","root","","tests");
    
$sql "INSERT INTO test SET test=?";
    
$res $db->prepare($sql);
    
$res->bind_param("s",$foo->bar);  // Notice: Indirect modification of overloaded property foo::$bar has no effect in /var/www/overload.php on line 24
    
$res->execute();  // Eintrag: Hallo Welt!
    
$foo->setBar("Und tschüß");
    echo 
$foo->bar;   // Ausgabe: Und tschüß
    
$res->execute();  // Eintrag: Hallo Welt!
?>
Verwendet man die SPL_Types und hat somit auch Strings, Integers etc. als Objekte, so besteht diese Problematik nicht. Da die aber experimentell und auch nicht default-mäßig verfügbar sind ist natürlich die Frage, inwieweit man sich darauf verlassen will.
SinnlosS ist offline   Mit Zitat antworten
Alt 07.06.2011, 17:59  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.994
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Zitat:
werden diese Referenzen nicht auf die Objekt-Eigenschaft gelegt wenn die Eigenschaft über __get geholt wird:
Wie sollten sie auch - sie existieren ja auch nicht als Eigenschaften.
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist offline   Mit Zitat antworten
Alt 07.06.2011, 18:24  
Benutzer
 
Registriert seit: 16.07.2010
Beiträge: 80
PHP-Kenntnisse:
Fortgeschritten
SinnlosS befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von nikosch Beitrag anzeigen
Wie sollten sie auch - sie existieren ja auch nicht als Eigenschaften.
Klar, das ist richtig. Wenn man es einmal realisiert hat ist das ein normales logisches Verhalten. Aber wenn man erstmal nicht groß drüber nachdenkt kann einem da schonmal leicht ein Flüchtigkeitsfehler unterlaufen.
SinnlosS ist offline   Mit Zitat antworten
Alt 07.06.2011, 18:29  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.994
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

bind_param finde ich sowieso ein sehr unübersichtliches Prinzip.
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist offline   Mit Zitat antworten
Alt 08.06.2011, 05:03  
Erfahrener Benutzer
 
Benutzerbild von mermshaus
 
Registriert seit: 14.06.2009
Beiträge: 1.733
PHP-Kenntnisse:
Fortgeschritten
mermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz sein
Standard

__get kann allerdings Referenzen zurückgeben, was übrigens ebenfalls in den Kommentaren in der Doku steht.

PHP-Code:
<?php

class Foo
{
    protected 
$bar = array('d''b''a''c');

    public function &
__get($name)
    {
        if (
$name === 'bar') {
            return 
$this->bar;
        }

        throw new 
Exception('');
    }
}

error_reporting(-1);

$foo = new Foo();

sort($foo->bar);

print_r($foo->bar);
Das fühlt sich dennoch etwas seltsam an.
__________________
Blog | Buch | Kaloa
mermshaus ist offline   Mit Zitat antworten
Alt 08.06.2011, 11:40  
Benutzer
 
Registriert seit: 16.07.2010
Beiträge: 80
PHP-Kenntnisse:
Fortgeschritten
SinnlosS befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von nikosch Beitrag anzeigen
bind_param finde ich sowieso ein sehr unübersichtliches Prinzip.
Ja stimmt schon. Ich nutze das irgendwie aus Gewohnheit noch meistens. Wird aber wohl langsam mal Zeit mir PDO und dann auch mal Doctrine2 reinzuziehen.


Zitat:
Zitat von mermshaus Beitrag anzeigen
__get kann allerdings Referenzen zurückgeben, was übrigens ebenfalls in den Kommentaren in der Doku steht.

PHP-Code:
<?php

class Foo
{
    protected 
$bar = array('d''b''a''c');

    public function &
__get($name)
    {
        if (
$name === 'bar') {
            return 
$this->bar;
        }

        throw new 
Exception('');
    }
}

error_reporting(-1);

$foo = new Foo();

sort($foo->bar);

print_r($foo->bar);
Das fühlt sich dennoch etwas seltsam an.
Ja stimmt, mit &__get wird auch bei meinem Beispiel "Hallo Welt!" und "Und tschüß" eingetragen. Geht mir aber wie dir, fühlt sich etwas seltsam an, ich kann aber nicht genau sagen wieso.
Hatte bei den Comments wohl nicht weit genug runtergescrollt, bzw den Beitrag irgendwie übersehen. Wobei das eigentlich auch recht naheliegend ist.
SinnlosS ist offline   Mit Zitat antworten
Alt 08.06.2011, 17:10  
Erfahrener Benutzer
 
Benutzerbild von mermshaus
 
Registriert seit: 14.06.2009
Beiträge: 1.733
PHP-Kenntnisse:
Fortgeschritten
mermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz sein
Standard

Habe einige Tests gemacht, weil ich in der Doku nichts dazu gefunden habe:

PHP-Code:
<?php

error_reporting
(-1);


// Geht

class Foo
{
    public function &
bar() {}
}

class 
FooChild extends Foo
{
    protected 
$bar 'bar';
    public function 
bar() { return $this->bar; }
}

$fc = new FooChild();
echo 
$fc->bar();



// Geht

class Foo2
{
    public function 
bar() {}
}

class 
Foo2Child extends Foo
{
    protected 
$bar 'bar';
    public function &
bar() { return $this->bar; }
}

$fc = new Foo2Child();
echo 
$fc->bar();



// Fatal error: Declaration of Foo3Child::bar() must be compatible with that of 
// Foo3::bar()

abstract class Foo3
{
    abstract public function &
bar();
}

class 
Foo3Child extends Foo3
{
    protected 
$bar 'bar';
    public function 
bar() { return $this->bar; }
}

$fc = new Foo3Child();
echo 
$fc->bar();



// Geht

abstract class Foo4
{
    abstract public function 
bar();
}

class 
Foo4Child extends Foo4
{
    protected 
$bar 'bar';
    public function &
bar() { return $this->bar; }
}

$fc = new Foo4Child();
echo 
$fc->bar();
__________________
Blog | Buch | Kaloa
mermshaus 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

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
implementieren von gettern und settern

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