php.de

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

PHP-Fortgeschrittene Arbeiten mit PHP ohne Einschränkungen

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 08.12.2004, 03:20   #1 (permalink)
Gast
 
Beiträge: n/a
Standard Objektorientierter Zugriff auf Multidimensionale Arrays

Hallo,

als Neuling hier am Board, möchte ich gerne eine Diskussion anstoßen um mal eine Methode zu vergleichen, mit der ich arbeite.

Nehmen wir an ich verwende ein multidimensionales Array als Datenspeicher. Dieses Array ist jetzt eine Member-Variable einer instanzierten Klasse. Saubere OOP verbietet jetzt natürlich den direkten Zugriff auf diese Member-Variable wie z.B.:
Code:
$object->multiArray['auto']['tuer']['farbe'];
Statt dessen soll natürlich eine Methode den Zugriff übernehmen. Jetzt gehen wir davon aus, daß die Tiefe des multidimensionalen Arrays variabel ist und nicht vorher gesagt werden kann. Da in PHP Variablen-Bezeichnungen für multidimensionale Arrays leider nicht variabel gebildet werden können, habe ich dafür eine Browse-Methode geschrieben, die das Ziel einer Abfrage als Array übergeben bekommt, z.B.:
Code:
$object->getVar(array('auto', 'tuer', 'farbe'));
Die Methode getVar() gibt nun jeweils einen Wert des übergebenen Arrays an browseArray() weiter, welche diesen als Index für das multidimensionale Array benutzt und jeweils die nächste Ebene als Referenz übergeben läßt. Das geht solange bis kein Array mehr vorhanden ist, z.B.:
Code:
function getVar($position) {
	// Basis-Position
	$value =& $this->multiArray;

	// Geht schrittweise durch das von getVar() übergeben Objekt durch.
	for ($i = 0; $i < count($position); $i++) {
		if (!$value =& $this->browseArray($value, $position[$i])) {
			// Falsche Positionsangabe
			return false;
		}
	}

	// War die Positionsangabe korrekt, enthält $value jetzt den Inhalt des letzten Elements.
	return $value;
}

function &browseArray(&$array, $target) {
	if (is_array($array)) {
		if (array_key_exists($target, $array)) {
			return $array[$target];
		}
	}
	return false;
}
Das funktioniert auch wunderbar. Ich frage mich nur, ob es nicht bessere und vor allem schnellere Methoden gibt, die ich bisher übersehen habe.

Freue mich über jeden Kommentar.

Gruß
Ensis
  Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

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

Alt 08.12.2004, 05:24   #2 (permalink)
Erfahrener Benutzer
 
Registriert seit: 14.01.2004
Beiträge: 2.543
fantast
fantast eine Nachricht über ICQ schicken
Standard

du koenntest das ganze rekursiv angehen, waere vielleicht noch ein wenig eleganter als deine loesung, aber schneller mit sicherheit nicht... mehr faellt mir auch nich ein.
__________________
Was ist validität?
fantast ist offline   Mit Zitat antworten
Alt 08.12.2004, 06:09   #3 (permalink)
Gast
 
Beiträge: n/a
Standard

Zitat:
Das funktioniert auch wunderbar. Ich frage mich nur, ob es nicht bessere und vor allem schnellere Methoden gibt, die ich bisher übersehen habe.
Kann ja möglich sein, daß ich Dich falsch verstehe, aber was ist gegen das einzuwenden:
PHP-Code:
<?php
# klasse
public varset($name$array)
{
  
$this->$name $array;
}

public 
varget($name)
{
  return 
$this->$name;
}

#
?>
  Mit Zitat antworten
Alt 08.12.2004, 10:10   #4 (permalink)
Waq
Erfahrener Benutzer
 
Registriert seit: 15.08.2004
Beiträge: 2.473
Waq
Standard Re: Objektorientierter Zugriff auf Multidimensionale Arrays

Zitat:
Zitat von Ensis
Saubere OOP verbietet jetzt natürlich den direkten Zugriff auf diese Member-Variable
Die saubere OOP würde ich hier in den Wind schiessen. Zuviele Kosten, zu wenig Nutzen.

Falls man beim Zugriff auf die Variable noch etwas ausführen will, kann man in PHP 5 immer noch Interzeptoren verwenden.
__________________
mod = master of disaster
Waq ist offline   Mit Zitat antworten
Alt 08.12.2004, 12:40   #5 (permalink)
Gast
 
Beiträge: n/a
Standard

@fantast, hast du da ein Beispiel, wie du das lösen würdest?

@meikel, das gesamte Array geliefert zu bekommen ist nicht der Sinn der Sache. Die erwähnte Methode erlaubt den Zugriff auf ein einzelnes Element eines multidimensionalen Arrays.

@Waq, ich weiß, der ewige Zwiespalt. Aber ich würde den Nutzen nicht unterschätzen und so läuft es ja auch. Aber wie sollen Interceptors bei der dynamischen Navigation durch das Array helfen?
  Mit Zitat antworten
Alt 08.12.2004, 12:58   #6 (permalink)
Waq
Erfahrener Benutzer
 
Registriert seit: 15.08.2004
Beiträge: 2.473
Waq
Standard

Zitat:
Zitat von Ensis
ich würde den Nutzen nicht unterschätzen
Im Moment scheinst Du es nicht zu brauchen. Wenn sich ändern sollte, kann man dass durch die __get()/__set()-Interzeptoren nachholen. Über diese kann man implizite getter und setter bauen, die aufgerufen werden, sobald auf die entsprechende Variable zugegriffen wird.
Ausserdem finde ich, dass es die Sache nicht hübscher macht, wenn man um eine undefinierte Datenstruktur ein einfaches Interface setzt, ohne dass dieses die Datenstruktur oder den Zugriff darauf vereinheitlicht.

Mal abgesehen davon, dass getter und setter sowieso nicht unumstritten sind. Ich finde sie reichlich sinnlos.
http://c2.com/cgi/wiki?AccessorsAreEvil
__________________
mod = master of disaster
Waq ist offline   Mit Zitat antworten
Alt 08.12.2004, 13:11   #7 (permalink)
Gast
 
Beiträge: n/a
Standard

Das ist vielleicht im letzten Posting nicht rüber gekommen, aber ich habe auch schon mit Interceptors gearbeitet. Ich sehe hier nur nicht den Anwendungszweck. Es geht ja um den Zugriff auf die einzelnen Ebenen des Array, quasi eine Baumstruktur.
  Mit Zitat antworten
Alt 08.12.2004, 14:23   #8 (permalink)
Erfahrener Benutzer
 
Registriert seit: 14.01.2004
Beiträge: 2.543
fantast
fantast eine Nachricht über ICQ schicken
Standard

warte lass mich mal ueberlegen.
PHP-Code:
function getVar($position, &$array NULL) {
    if (!
is_array($position)) return false;
    if (
$array == NULL$array =& $myArray;
    
    if ((
count($position) == 1) {
        if (
array_key_exists($position[0], $array)) return $array[$position[0]];
        else return 
false;
    } 
    
    if (
array_key_exists($position[0], $array) && is_array($array[$position[0]])) {
        return 
getVar(array_shift($position), $array[$position[0]]);
    } else return 
false;

ungetested und benutzung auf eigenes risiko, aber so ungefaehr muesste das aussehn...

#edit ich seh grad, man muesste noch nich mal mit referenzen arbeiten. das klappt auch mit "einfachen" variablen. ach ja und ich find accessor methods seeehr sehr hilfreich und sinnvoll. die wegzulassen spart zwar sicherlich code und zeit, aber erhoert dadurch den wartungsaufwand einer anwendung erheblich...
__________________
Was ist validität?
fantast ist offline   Mit Zitat antworten
Alt 08.12.2004, 14:33   #9 (permalink)
Gast
 
Beiträge: n/a
Standard

Zitat:
Zitat von Ensis
@meikel, das gesamte Array geliefert zu bekommen ist nicht der Sinn der Sache. Die erwähnte Methode erlaubt den Zugriff auf ein einzelnes Element eines multidimensionalen Arrays.
Dann eben so:
http://test.php-help.info/class-5/ (Quelltext wird angezeigt)

btw: hoffentlich taucht das Beispiel nicht irgend wo mal als 'sinnloser Code' auf.
  Mit Zitat antworten
Alt 08.12.2004, 14:51   #10 (permalink)
Waq
Erfahrener Benutzer
 
Registriert seit: 15.08.2004
Beiträge: 2.473
Waq
Standard

Zitat:
Zitat von fantast
ach ja und ich find accessor methods seeehr sehr hilfreich und sinnvoll. die wegzulassen spart zwar sicherlich code und zeit, aber erhoert dadurch den wartungsaufwand einer anwendung erheblich...
Hast Du mal meinen Link verfolgt? Der Author meint, jeder Accessor, den er je gesehen hätte, hätte schlecht gerochen... und ich denke, er hat recht. Ordentliche OOP-Interfaces kommen normalerweise ohne Accessoren für einzelne Variablen aus.
Und wenn man es mit dem Design nicht so ernst nimmt, wozu überhaupt Accessoren? Zur Not kann man deren Funktionalität noch durch Interzeptoren nachtragen.

Wobei ich finde, dass dieser Code nicht nur riecht, sondern richtiggehend stinkt. Für eine Datenstruktur wie einen Baum ist das einfach keine geeignete Zugriffsmethode. Bäume verarbeitet man rekursiv, zum Zugriff eignen sich z.B. verschachtelte Objekte, vorzugsweise lazy instanziiert.
Auf so ein unstrukturiertes Interface Accessoren draufzusetzen und dann zu meinen, "guck mal, tolles OOP" halte ich einfach für Unsinn. Hier wird mit viel zu grossem Aufwand an unwichtigen Dingen rumgedoktert und die eigentlichen Probleme werden ignoriert.
__________________
mod = master of disaster
Waq ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

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

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
Mehrere Arrays summieren buggybugga PHP-Fortgeschrittene 8 22.07.2008 11:51
Zugriff beschränken paper PHP Tipps 2008 9 04.05.2008 12:13
Arrays sortieren, Bezeichnung, Preis Ticos PHP Tipps 2006 4 07.09.2006 19:37
Arrays kreuzen PHP Tipps 2006 13 08.03.2006 11:36
Zugriff auf postgresql-db mit php PHP Tipps 2006 6 25.01.2006 09:29
[Erledigt] 2 Arrays miteinander vergleichen PHP Tipps 2007 3 17.12.2005 16:54
Verzeichnis (Dateien) schützen aber per PHP zugriff zulassen Server, Hosting und Workstations 2 16.10.2005 10:13
Wie Ordner und Inhalt vor unberechtigten Zugriff schützen Riot PHP Tipps 2005-2 30 06.10.2005 21:18
Problem beim vergleichen von 2 Arrays PHP Tipps 2005-2 1 06.10.2005 14:25
Zugriff auf phpmyadmin PHP Tipps 2005 1 28.02.2005 18:41
Kombination von mehreren Arrays PHP-Fortgeschrittene 27 18.02.2005 23:33
[Erledigt] Letzter zugriff von Datei anzeigen PHP Tipps 2005 13 17.01.2005 18:20
Erkennung von Arrays in Strings PHP-Fortgeschrittene 15 07.12.2004 13:00
2 arrays in abhängigkeit ??? PHP Tipps 2004 2 11.08.2004 21:19
Werte eines Arrays in eine MySQL schreiben PHP Tipps 2004 2 28.06.2004 13:32

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
array multi object, php objektorientiert array, php get array position, php klasse return array, php objektorientiert array vergleichen, impliziten getter, php array object eintrag ändern, array zugriff schützen php, php class return array, php find position array, array aus objekten einzelnes element php, baumstrucktur mit php objaktorientiert, jeder datenspeicher ist ein dimensionales array, multidimensional arrays verarbeiten, array zugriff position, php object array, rekursiv ein objekt php, beim zugriff auf object werden nur teile angezeigt php, array rekursiv in object auflösen php, php objectorientiert array

Alle Zeitangaben in WEZ +1. Es ist jetzt 20:47 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2010, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.