php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger

PHP Einsteiger PHP Problemlösungen für Spracheinsteiger
Archive: 2004, 2004/2, 2005, 2005/2, 2006, 2007, 2008, 2009, 2010,

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 19.01.2011, 08:02  
Neuer Benutzer
 
Registriert seit: 19.01.2011
Beiträge: 2
PHP-Kenntnisse:
Anfänger
readyaim befindet sich auf einem aufstrebenden Ast
Standard Zwei Methoden eines Objekts: PHP übergeht eine der beiden

Hallohallo!

Für die Uni bastel ich im Moment an einer einfachen PHP-Seite. Die Aufgabenstellung ist die folgende: Wir sollen mithilfe objektorientierter Programmierung Daten sortieren, die in einem Formular eingegeben wurden. Zuletzt hatten wir das schon ohne Klasse gemacht; es geht halt nicht um sinnvolle Implementierung, sondern darum, das mal gemacht zu haben

Hier ist mein Code:

PHP-Code:
<?php                                
    
class sortierdieelemente
    
{
        
/*Sortiert werden sollen die fünf
         eingegebenen Namen. Darum müssen dafür
         fünf Variablen und eine für das Array
         vorab eingeführt werden.*/
        
        
public $name1;
        public 
$name2;
        public 
$name3;
        public 
$name4;
        public 
$name5;
        
        public 
$namen = array();
        
        
/*In der Funktion sortieren() wird die
         PHP-eigene Funktion sort() aufgerufen,
         mit der die Werte des Arrays auf-
         steigend sortiert werden.*/
        
        
public function sortieren($array)
        {
            
sort($array);
        }
        
        
/*Die Funktion ausgeben() gibt per
         foreach() jedes Element des sortierten
         Arrays aus und wird später im dann
         initialisierten Objekt der Klasse
         aufgerufen.*/
        
        
public function ausgeben($array)
        {
            foreach (
$array as $element)
            {
                echo 
"<tr><td>$element</td></tr>";
            }
        }
    }
    
    
/*Das Objekt wird initalisiert.*/
    
    
$arraysortierung = new sortierdieelemente;   
    
    
/*Die Variablen $a bis $e dienen dazu, den
     Code übersichtlicher zu gestalten. Da sie
     in der Definition des $namen-Arrays benutzt
     werden, bietet es sich an, sie abzukürzen
     und nicht die Verweise mit ...->name zu
     verwenden.*/
    
    
$a $arraysortierung->name1=$_POST["tn1"];
    
$b $arraysortierung->name2=$_POST["tn2"];
    
$c $arraysortierung->name3=$_POST["tn3"];
    
$d $arraysortierung->name4=$_POST["tn4"];
    
$e $arraysortierung->name5=$_POST["tn5"];
    
    
/*Jetzt wird das Array $namen mit Werten
     aus dem Formular gefüllt.*/
    
    
$namen $arraysortierung->namen=array($a,$b,$c,$d,$e);
    
    
/*Hier sollte eigentlich sortiert werden,
     die Sortierung wird aber im Moment noch
     übergangen - warum auch immer!*/
    
    
$arraysortierung->sortieren($namen);
    
    
/*Die Funktion zur Ausgabe des Arrays wird
     aufgerufen.*/
    
    
$arraysortierung->ausgeben($namen);
?>
Die eingegebenen Daten sind übrigens fünf Namen, die man in einem HTML-Formular vorher eingegeben hat und die mit tn1 bis tn5 benannt sind.

Das Problem ist (in den Kommentaren im Quellcode wird das ja schon deutlich), dass die Sortiermethode einfach übergangen wird. Wenn ich nur die Sortiermethode aufrufe und darin z. B. eine Überprüfung mit if implementiere, wird die Sortierung allerdings durchgeführt. Das heißt, dass irgendwie die Ausgabe die Sortierung stört offenbar.

Bei
PHP-Code:
sort($namen);
$arraysortierung->ausgeben($namen); 
funktioniert die Sortierung dann übrigens auch. Aber so wie ich die Aufgabenstellung verstanden habe, sollen das Sortieren und das Ausgeben eben zwei verschiedene Methoden sein...

Es wäre klasse, wenn mir jemand helfen könnte! Ich denke, ich hab das Problem ausführlich dargestellt und hoffe, ich hab nix vergessen. Bitte habt Nachsicht, falls es n doofer Fehler ist - ich bin noch Anfänger

Schöne Grüße,
Daniel
readyaim ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

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

Alt 19.01.2011, 08:17  
Erfahrener Benutzer
 
Registriert seit: 17.08.2010
Beiträge: 216
PHP-Kenntnisse:
Fortgeschritten
Dormilich befindet sich auf einem aufstrebenden Ast
Standard

das Hauptproblem is das Klassendesign. dein Code hat mit OOP überhaupt nichts zu tun. du benutzt lediglich Properties als Variablen und Methoden als Funktionen ohne auf den Sinn von Objekten (z.B. Datenkapselung) einzugehen. ich vermute mal daß das Problem mit dem Scope zusammenhängt, da die Sortierung in der Methode ja funktioniert.

nur mal ein Beispiel für eine sinnvolle Änderung:
PHP-Code:
        public function sortieren()
        {
            
sort($this->namen);
        } 
Dormilich ist offline   Mit Zitat antworten
Alt 19.01.2011, 08:31  
Erfahrener Benutzer
 
Registriert seit: 13.05.2009
Beiträge: 1.164
PHP-Kenntnisse:
Fortgeschritten
dennis81 befindet sich auf einem aufstrebenden Ast
Standard

sort

Schau dir mal die Signatur der Funktion genauer an:
Code:
bool sort ( array &$array [, int $sort_flags = SORT_REGULAR ] )
$array wird als Referenz entgegengenommen. (durch das &). In deiner Variante wird aber eben keine Referenz verwendet. Du sortierst damit eine lokale Kopie von $array.

PHP-Code:
public function sortieren($array)
        {
            
sort($array); // <-- Hier ist $array nicht DAS $array, was du mal übergeben hast, sondern "nur" eine Kopie dessen.
        

__________________
Es ist schon alles gesagt! Nur noch nicht von allen! (Karl Valentin)
Wenn du eine weise Antwort verlangst, musst du vernünftig fragen. (Johann Wolfgang von Goethe)
dennis81 ist offline   Mit Zitat antworten
Alt 19.01.2011, 08:49  
Erfahrener Benutzer
 
Registriert seit: 15.04.2010
Beiträge: 813
PHP-Kenntnisse:
Fortgeschritten
Paul.Schramenko befindet sich auf einem aufstrebenden Ast
Standard

Ich weiß nicht genau was du da gemacht hast, aber OOP ist das nicht. Deine Names-Arrays haben keinerlei Bezug zu einander. Du übergibst das Array an die Funktion in der Klasse zum sortieren und arbeitest anschließend mit dem Ursprungsarray wieder, natürlich funktioniert das dann nicht.
Entweder du arbeitest mit der Referenz, dass ist der "Brezeloperator" (&) oder du setzt das Array in eine Klassenvariable.

Name1, name2, name3, usw.
Was machst du wenn du mal 100Name oder gar 1000 Namen sortieren musst? Legst du dann dem entsprechend viele Klassenvariablen an?

So was könntest du zum Beispiel machen, gut ist anders, ist aber schon mal ein Anfang:
PHP-Code:
class SortTheElements
{
    protected 
$_elementsIWantToSort = array();

    public function 
__construct(array $elements = array())
    {
        
$this->setElements($elements);
    }
    
    public function 
setElements(array $elements = array()) {
        
$this->_elementsIWantToSort $elements;
        return 
$this;
    }
    
    public function 
sort()
    {
        
sort($this->_elementsIWantToSort);
        return 
$this;
    }
    
    public function 
printItems()
    {
        foreach (
$this->_elementsIWantToSort as $element)
        {
            echo 
"<tr><td>$element</td></tr>";
        }
    }

und der Aufruf der Klasse:
PHP-Code:
$names = array();
$names[] = $_POST["tn1"];
$names[] = $_POST["tn5"];
$names[] = $_POST["tn3"];
$names[] = $_POST["tn4"];
$names[] = $_POST["tn2"];


$sortingClass = new SortTheElements();
$sortingClass->setElements($names)
    ->
sort()
    ->
printItems();

/*oder sowas
$sortingClass = new SortTheElements($names);
$sortingClass->sort()
    ->printItems();
*/ 
__________________
"My software never has bugs, it just develops random features."
"Real programmers don't comment. If it was hard to write, it should be hard to understand!"
Positive Bewertungen sind nicht unwillkommen...
Paul.Schramenko ist offline   Mit Zitat antworten
Alt 19.01.2011, 15:48  
Neuer Benutzer
 
Registriert seit: 19.01.2011
Beiträge: 2
PHP-Kenntnisse:
Anfänger
readyaim befindet sich auf einem aufstrebenden Ast
Standard

Hallo,

herzlichen Dank für eure Hilfe. Das Beste daran: Ich hab jetzt nicht nur die Lösung, sondern vor allem auch ne Menge mehr verstanden.

Die wesentlichen Unterschiede zu meinem falschen Ansatz sind ja die Selbstreferenzierung per $this und die Sichtbarkeitsbeschränkung des Arrays in der Klasse. Sind das die Punkte, durch die sich hier das OOP auszeichnet?

Gruß,
Daniel
readyaim ist offline   Mit Zitat antworten
Alt 19.01.2011, 15:50  
Erfahrener Benutzer
 
Registriert seit: 17.08.2010
Beiträge: 216
PHP-Kenntnisse:
Fortgeschritten
Dormilich befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von readyaim Beitrag anzeigen
Die wesentlichen Unterschiede zu meinem falschen Ansatz sind ja die Selbstreferenzierung per $this und die Sichtbarkeitsbeschränkung des Arrays in der Klasse. Sind das die Punkte, durch die sich hier das OOP auszeichnet?
1. ja (unter anderem)
2. nein, das kann dir auch bei Funktionen passieren.
Dormilich 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
[Erledigt] Eigenschaften vom Konstruktor an Methoden übergeben litterauspirna JavaScript, Ajax und mehr 1 28.12.2010 10:10
[Erledigt] Objekt mit statischen Methoden hts JavaScript, Ajax und mehr 3 18.12.2010 21:07
[Erledigt] Methoden zu einer Klasse hinzufügen ByStones PHP Tipps 2010 3 30.08.2010 23:58
Objekte verwenden gleiche Methoden Cube PHP Tipps 2010 2 21.04.2010 09:25
Objekt als Attribut eines weiteren Objekts. Wie ordentlich auslesen? Asipak PHP-Fortgeschrittene 14 16.04.2010 15:43
Methoden werden nicht vererbt stayInside PHP Tipps 2009 12 15.03.2009 00:24
Kindklasse: Methoden über _call() ergänzen? ciss PHP Tipps 2008 2 29.12.2008 18:08
[Erledigt] Methoden auf Objekt aufrufen (und fangen), die nicht existieren tsisson PHP Tipps 2008 2 07.10.2008 18:19
Referenzen Private Methoden. notyyy PHP-Fortgeschrittene 5 29.05.2008 09:40
UML - Abstrakte und vererbte Methoden zwingend anzugeben? MaMo-Net Off-Topic Diskussionen 3 17.03.2008 06:04
reflection - wie führe ich alle methoden einer klasse aus... Crypi PHP Tipps 2008 2 20.02.2008 22:51
DAO - Methoden dh1sbg PHP-Fortgeschrittene 2 17.12.2006 17:52
Zugriff auf statische methoden oder konstanten nightfreak PHP-Fortgeschrittene 6 14.11.2005 16:56
get udn set Methoden seven-12 PHP Tipps 2005-2 3 23.06.2005 22:19
klassen und methoden anderer klassen in methoden.... PHP Tipps 2005 17 25.05.2005 09:46

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
public function sortieren, class in objekten in funktionen variablen übergeben array php $_post, php sort methoden, php name des objekts, php formular udn klassen, brezeloperator, php alle methoden eines objekts, php oop $_post foreach klasse, html eingegebenen namen ausgeben

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