php.de

Zurück   php.de > Webentwicklung > PHP-Fortgeschrittene

PHP-Fortgeschrittene Arbeiten mit PHP ohne Einschränkungen

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 07.03.2011, 22:04  
Moderator und Wett-König
 
Benutzerbild von dr.e.
 
Registriert seit: 21.05.2008
Beiträge: 3.657
PHP-Kenntnisse:
Fortgeschritten
dr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblick
dr.e. eine Nachricht über Skype™ schicken
Standard

Zitat:
Unter PHP5.3 sehe ich kaum einen Grund, im OOP-Bereich mit Referenzen zu arbeiten. Abgesehen vielleicht vom Ausnutzen von Seiteneffekten bei Methodenaufrufen. Es mag dafür sinnvolle Beispiele geben, aber spontan würde ich sagen: code smell.
Das bedeutet konsequenterweise aber, dass du beim traversieren eines Baumes immer Kopien erzeugen und auf diesen arbeiten willst? Das halte ich für einen Fehler. Umgekehr formuliert: warum soll ich mit einer Kopie arbeiten, wenn ich auch das Original haben kann!
__________________
Viele Grüße,
Dr.E.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. Think about software design before you start to write code!
2. Discuss and review it together with experts!
3. Choose good tools (-> Adventure PHP Framework (APF))!
4. Write clean and reusable software only!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dr.e. ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

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

Alt 07.03.2011, 23:58  
Neuer Benutzer
 
Registriert seit: 05.03.2011
Beiträge: 16
PHP-Kenntnisse:
Fortgeschritten
laszlokorte befindet sich auf einem aufstrebenden Ast
Standard

@mermshaus Ich dachte meine Frage zu den Referenzen, auf die du dich beziehst, wäre geklärt nachdem ich im php manuel weiter gelesen hatte.

Inzwischen bin ich mir aber nicht mehr so sicher ob ich es richtig verstanden hab, also greif ich den Code von dr.e. noch mal auf:

PHP-Code:
class MyClass {

   public function &
getFoo() {
     foreach (
$this->children as $id => $DUMMY) {
        if (
$this->children[$id]->getFoo() == 'bar') {
           return 
$this->children[$id];
        }
     }
  }    

}

$obj = new MyClass();

// davon ausgehen, dass $children schon mit ein paar objekten gefüllt ist.

$foo $obj->getFoo();
# jetzt müsste foo ja die referenz zu dem objekt in $obj->children[x] haben.
# wenn ich nun also:
$foo = new Child();
# setze, müsste doch sogar der x'te Wert des Internen $children-Arrays des $obj-Objekts geändert werden oder?
# denn $foo und $children[x] haben ja eine gemeinsamen Pointer auf eine Referenz.
# Also würde man mit Getter-Methoden einer Klasse, die den Wert per Referenz(alias?) zurückgeben die property auch zum beschrieben public machen?

# denn so:
$a 'x';
$b =& $a;
$b 'y';

# ändere ich ja auch den Werte von $a
# also müsste ich so:

class Blub {
  protected 
$x;

  public function &
getX()
  {
     return 
$this->x;
  }
}

$blub = new Blub();
$x $blub->getX();
$x 'abc';

# doch auch den Wert von protected-$x ändern können? 
Bin mir nicht sicher ob ich es jetzt richtig ausgedrückt ist, aber wenn es so ist, wie ich es grade verstanden habe, verstehe ich aber nicht was daran vorteilhaft sein soll :P

Und ich verstehe auch nicht warum du dr.e. lieber den original-pointer zu einem objekt hast als eine kopie des pointers, wenn das objekt selbst doch sowieso nicht kopiert wird und du ja gar nicht davon ausgehen kannst, dass es wirklich "das Original" ist, weil du ja nicht wie oft das Objekt seit der Instanzierung schon verschiedenen Variablen zugewiesen wurde, also wie viele Kopien des Pointers es schon gibt.
laszlokorte ist offline   Mit Zitat antworten
Alt 08.03.2011, 00:13  
Erfahrener Benutzer
 
Benutzerbild von mermshaus
 
Registriert seit: 14.06.2009
Beiträge: 1.731
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

@dr.e.: Na ja, mir ist das Problem, das du beschrieben hast, bisher nicht untergekommen. Ich bin absolut nicht der Ansicht, dass in PHP 5.3 eine getChildren-Methode, die ein Array von Instanzen liefert, beim Durchlaufen dieses Arrays in irgendeiner Form die Instanzen klont (falls das mit „kopieren“ gemeint ist, siehe fabs Hinweis zur exakten Ausdrucksweise – interpretiere ich hier vielleicht falsch). Das würde mich extrem verwundern. Allein der Verdacht, dass da etwas in der Art passieren könnte, verstört mich allerdings gerade ziemlich.

Ich sehe eher Probleme bei der Rückgabe von Referenzen (siehe &getFoo), da du diese beispielsweise „nullen“ kannst (oder was weiß ich was noch) und dann in der Children-Liste an der Stelle null stehen hättest, was zu zig Problemen im internen Code führen dürfte, wenn dieser davon ausgeht, dass Instanzen bestimmter Klassen vorliegen.

Edit: Ehrlichgesagt glaube ich nicht mal, dass die oben gezeigte Implementation von &getFoo überhaupt eine Referenz auf eine Instanz der Children-Objektliste liefert. Hm. Muss ich testen. Doch, tut sie. Lang ist's her.
__________________
Blog | Buch | Kaloa

Geändert von mermshaus (08.03.2011 um 00:39 Uhr).
mermshaus ist offline   Mit Zitat antworten
Alt 08.03.2011, 08:33  
Erfahrener Benutzer
 
Benutzerbild von mermshaus
 
Registriert seit: 14.06.2009
Beiträge: 1.731
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

Zitat:
Zitat von laszlokorte
PHP-Code:
# also müsste ich so:

class Blub {
  protected 
$x;

  public function &
getX()
  {
     return 
$this->x;
  }
}

$blub = new Blub();
$x $blub->getX();
$x 'abc';

# doch auch den Wert von protected-$x ändern können? 
Ja, du musst allerdings beim Zuweisen des Rückgabewerts auch „&“ hinzufügen, wenn du die Referenz willst. (Das ist die Sache, die ich im letzten Post erst übersehen hatte. Hatte das „&“ im return-Statement erwartet… ) Ohne „&“ bekommst du eine echte Kopie des Object Identifiers (was meiner Einschätzung nach nahezu immer die sinnvollere Alternative ist). Die OI-Kopie würdest du aber auch ohne das „&“ in der Methodensignatur erhalten.

PHP-Code:
$x =& $blub->getX(); 
- http://www.php.net/manual/en/languag...ces.return.php

PHP-Code:
class Child
{
    protected 
$foo;

    public function 
__construct($foo)
    {
        
$this->foo $foo;
    }

    public function 
getFoo()
    {
        return 
$this->foo;
    }
}

class 
MyClass
{
    protected 
$children;

    public function 
__construct()
    {
        
$this->children = array(
            new 
Child('hello'),
            new 
Child('world'),
            new 
Child('bar')
        );
    }

    public function &
getFoo()
    {
        foreach (
$this->children as $id => $DUMMY) {
            if (
$this->children[$id]->getFoo() == 'bar') {
                return 
$this->children[$id];
            }
        }
    }
}

$obj = new MyClass();
$foo =& $obj->getFoo();
$foo = new Child('blub');

var_dump($obj); // Child(hello), Child(world), Child(blub)

// Das Problem, das ich im letzten Post erwähnt habe:
$foo null;
var_dump($obj); // Child(hello), Child(world), null

$newFoo $obj->getFoo();
    
// Fatal error: Call to a member function getFoo() on a non-object
    //     (beim Erreichen des null-Werts in der Schleife)
    // Das kann nicht gut sein. 
__________________
Blog | Buch | Kaloa

Geändert von mermshaus (08.03.2011 um 08:49 Uhr).
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

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Problem mit Basedir in PhP cmuch05 Datenbanken 9 08.01.2009 14:17
[Erledigt] Problem: PHP Selbe Datei mehr als 1 Mal soulan PHP Tipps 2008 13 28.11.2008 22:51
Problem Upload mehrere Dateien und schreiben in DB Lapje PHP Tipps 2008 1 22.10.2008 13:12
utf8 Problem (Daten aus DB auslesen) go1denboy PHP Tipps 2008 1 23.09.2008 12:19
Problem mit swfobjects R4v3r JavaScript, Ajax und mehr 8 21.09.2008 14:17
[Erledigt] Galerie Problem... coraplanet PHP Tipps 2008 4 06.06.2008 13:42
performance problem mit join leo Datenbanken 4 14.01.2008 22:31
ImageMagick Performance Problem M3g4Star PHP Tipps 2006 1 30.11.2006 09:35
performance probleme in der community phoetron PHP-Fortgeschrittene 15 25.07.2006 08:37
datensätze defekt oder problem mit dem einlesen? Ministry Datenbanken 4 06.07.2006 18:42
problem!!! PHP Tipps 2006 6 08.02.2006 11:06
[Erledigt] wieder ein Problem bei phpmailer und smtp PHP Tipps 2006 24 07.02.2006 01:07
like opeartor - performance problem Datenbanken 15 08.12.2004 03:48
Smarty und PHP-Skript Problem PHP Tipps 2004-2 2 03.12.2004 22:27
Problem mit alter JavaScript-Funktion woods PHP Tipps 2004 1 13.08.2004 13:34


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