• Hallo liebe Userinnen und User,

    nach bereits längeren Planungen und Vorbereitungen sind wir nun von vBulletin auf Xenforo umgestiegen. Die Umstellung musste leider aufgrund der Serverprobleme der letzten Tage notgedrungen vorverlegt werden. Das neue Forum ist soweit voll funktionsfähig, allerdings sind noch nicht alle der gewohnten Funktionen vorhanden. Nach Möglichkeit werden wir sie in den nächsten Wochen nachrüsten. Dafür sollte es nun einige der Probleme lösen, die wir in den letzten Tagen, Wochen und Monaten hatten. Auch der Server ist nun potenter als bei unserem alten Hoster, wodurch wir nun langfristig den Tank mit Bytes vollgetankt haben.

    Anfangs mag die neue Boardsoftware etwas ungewohnt sein, aber man findet sich recht schnell ein. Wir wissen, dass ihr alle Gewohnheitstiere seid, aber gebt dem neuen Board eine Chance.
    Sollte etwas der neuen oder auch gewohnten Funktionen unklar sein, könnt ihr den "Wo issn da der Button zu"-Thread im Feedback nutzen. Bugs meldet ihr bitte im Bugtracker, es wird sicher welche geben die uns noch nicht aufgefallen sind. Ich werde das dann versuchen, halbwegs im Startbeitrag übersichtlich zu halten, was an Arbeit noch aussteht.

    Neu ist, dass die Boardsoftware deutlich besser für Mobiltelefone und diverse Endgeräte geeignet ist und nun auch im mobilen Style alle Funktionen verfügbar sind. Am Desktop findet ihr oben rechts sowohl den Umschalter zwischen hellem und dunklem Style. Am Handy ist der Hell-/Dunkelschalter am Ende der Seite. Damit sollte zukünftig jeder sein Board so konfigurieren können, wie es ihm am liebsten ist.


    Die restlichen Funktionen sollten eigentlich soweit wie gewohnt funktionieren. Einfach mal ein wenig damit spielen oder bei Unklarheiten im Thread nachfragen. Viel Spaß im ngb 2.0.

[PHP/MySQL] Karte mit X und Y-Koordinaten erstellen

accC

gesperrt

Registriert
14 Juli 2013
Beiträge
5.250
Ohje, dir fehlen viele Grundlagen.

Sagt dir Namespacing etwas?
Ein Objekt hat seinen eigenen Namesraum, jede Methode (funktion) wiederum ihren eigenen, kann aber auch auf den Namensraum des Objekts zugreifen und dann gibt es noch Parameter, die von außen kommen können:

[src=php]class car{

private $doors; // im Namensraum der Klasse

function bla($parameter){
$doors; // existiert nur innerhalb der Methode
// um die Anzahl der Türen des Objekts zu modifizieren
// musst du auf den entsprechenden Namespace zugreifen:
$this->doors;
// wie der übergebene Wert aus der Außenwelt hier interpretiert wird
// muss wiederum festgelegt werden:
$this->doors = $parameter;
}

}[/src]


Zeile 13 ist natürlich mein Fehler, das Beispiel habe ich nur mal schnell runter gezimmert..
[src=php]$this->Doors = in_array($Doors, array(3, 5) ? $Doors : 5;[/src]


Das ? : ist eine Kurzform für if:

[src=php]if(in_array($Doors, array(3, 5)){
$this->Doors = $Doors;
}else{
$this->Doors = 5;
}[/src]

Falls der Parameter Doors einen Wert hat, der auch in dem Array drin ist, also entweder 3 oder 5, dann soll das Auto eben die entsprechende Anzahl an Türen erhalten, sonst 5.

Schneller geht das mit dieser Syntax:

[src=php]$this->Doors = in_array($Doors, array(3, 5) ? $Doors : 5;[/src]

$this->Doors = falls $Doors in dem array mit 3 und 5 ? dann Doors : sonst 5;




distance ist eine Funktion, die (hoffentlich) die Distanz zwischen zwei Punkten auf einem 2D Koordinatenfeld berechnen kann.
 

Cyperfriend

Der ohne Avatar

Registriert
14 Juli 2013
Beiträge
1.123
  • Thread Starter Thread Starter
  • #22
Also die obrige Erklärung habe ich nicht verstanden (Das mit dem Namespace, Objekten und so. ICh habe es bestimmt schon tausendmal gelesen und sicherlich wende ich das in gewissen Bereichen auch unbewusst an, aber ich kann mit den Begriffen nichts anfangen. Ich weis auch, ass es Objekte, Methoden und co. in jeder Programmiersprache gibt, aber egal ob PHP, C++ C# oder Vb. Immer war Schluss wenn es an solche Themen ging.

Der Rest deiner Erklärung, also das mit dem Fragezeichen habe ich kapiert.

Vor allem versuche ich bei solchen Sachen immer das dann auf mein Projekt (in dem Fall Karte) zu übertragen und merke, dass ich scheitere, es also nicht kapiert habe, weil hätte ich es kapiert könnte ich es auf meinen Anwendungsfall übertragen. Die Beispiele kann ich aber zumindest logisch nachvollziehen - mehr aber nicht.
 

Cyperfriend

Der ohne Avatar

Registriert
14 Juli 2013
Beiträge
1.123
  • Thread Starter Thread Starter
  • #24
Das Ergebnis, also Die Addition von Zahl1+Zahl2
Wenn Zahl1 = 5 und Zahl2 = 5 ist, dann ist das Ergebnis 10.
 

Cyperfriend

Der ohne Avatar

Registriert
14 Juli 2013
Beiträge
1.123
  • Thread Starter Thread Starter
  • #26
Das ich gnadenlos versage, wenn es komplexer wird. Ich poste mal folgendes Beispiel aus meinem Script, aus dem ich schon lange eine Funktion machen wollte, weil ichs sehr oft brauche, bislang aber nicht auf die Reihe brachte.

[src=php]
<?php
$db_read = "select * from db_standorte where fk_kunden='".$_SESSION['kunden_id']."' order by ort asc";
$db_result = mysql_query($db_read, $db_connect) or die (mysql_error());
while($row = mysql_fetch_array($db_result)) {
?>
<option value="<?php echo $row['standort_id']; ?>"><?php echo $row['ort']." (".$row['strasse'].")"; ?></option>
<?php } ?>
[/src]

Das ist eine so einfache Abfrage, aber ich bekomme es nicht hin eine Funktion draus zu basteln, so dass ich anstatt der Datenbank und Variablen andere setzen kann.
 

BurnerR

Bot #0384479

Registriert
20 Juli 2013
Beiträge
5.505
Ich fands auch nicht besonders klar das mit den Namespaces, sorry accC :-(.

Der Punkt ist:
Ein Auto hat bestimmte Eigenschaften, bestimmte Zustände (angeschaltet, ausgeschaltet,...) und man kann Sachen damit machen (starten, fahren, tanken, Kofferraum öffnen,...).
Das muss nur formal für den Computer verständlich hingeschrieben werden.
Die Variablen (in dem Kontext auch Attribute genannt) sind die Eigenschaften und Zustände: Anzahl der Räder und Türen, ob der Motor gestartet ist, etc.
Die Funktionen (in dem Kontext auch Methoden genannt) machen irgendwas mit dem Auto, zum Beispiel den Motor starten oder das Auto irgendwo hin fahren.
Mehr passiert in dem Beispiel gar nicht.

Als Autobenutzer würdest du also z.B. die Tanken-Funktion mit der Menge Benzin die du tankst aufrufen, "fillup(100)" sag ich mal salopp, dann wird die entsprechende Funktion aufgerufen:
[src=php]
[...]
public function fillUp($amount){
$this->Fuel += abs($amount);
[...]
[/src]
Wobei die Variable $amount in dem Fall den Wert 100 hat.
Die Eigenschaft die den Tankstand speichert heißt bei der Auto-Klasse "Fuel". Und wir sehen dass Fuel um die Menge $amount erhöht wird, wenn man die Funktion also mit "fillUp(100) aufruft entsprechend um 100.
 

evillive

EXIL

Registriert
24 Juli 2013
Beiträge
930
mach einfach nicht ständig <?php ?> dann haut lässt sich auch leicht eine funktion daraus bauen.

[src=php]function blablub() {
$db_read = "select * from db_standorte where fk_kunden='".$_SESSION['kunden_id']."' order by ort asc";
$db_result = mysql_query($db_read, $db_connect) or die (mysql_error());
while($row = mysql_fetch_array($db_result)) {
echo '<option value="'.$row['standort_id'] .'">' .$row['ort']. '(' .$row['strasse'].')</option>';
}
}[/src]
 

theSplit

1998
Veteran Barkeeper

Registriert
3 Aug. 2014
Beiträge
28.573
Warum braucht man für diese Aufgabe den zwingend OOP?

Er will doch keine einzelnen Kartenabschnitt als Objektinstanzen haben, nehme ich mal an.

Hier mal mit Pseudocode:
[src=javascript]var kartenBreite = 10;
var kartenStücke = 50;
var aktuelleSpalte = 0;
var aktuelleReihe = 0;

var kartenPunkte= [0, 0, 9, 3, 3, 0, -1....]; //Array mit 50 Einträgen die sagen, kein Punkt -1, oder Punkt an 0,1.. 8, 9

for (var element = 0; element < kartenStücke; x++) {
if (element % aktuelleSpalte == 0) {
aktuelleSpalte = 0; // erzeuge Element mit "float: left; clear: left;"
aktuelleReihe += 1;
<div style="float: left; clear: left;";> //clear: left --> wir sind nun wieder bei Spalte 0
} else {
<div style="float: left";> //hängt einen div an das letzte Element in der Reihe an, rechte Seite!

}

if (mapPunkte != -1) {
//...zeichne den Punkt an Position oben links (0) ODER unten rechts (9), hier mit der Klasse angegeben die du per CSS stylen kannst;
switch (kartenPunkte[element]) {

case 0:
// oben links
klasse = "obenLinks";
break;
case 1:
// oben mitte
klasse = "obenMitte";
break;
}
<span class=" '+ klasse + ' ">o</span>
}


</div>

aktuelleSpalte += 1;
}[/src]

Der Modulo Operator --> % -- dividiert und liefert den Rest einer Division:
3 % 2 = 1
2 % 2 = 0 (Division geht glatt auf, kein Rest!)
4 % 2 = 0 (4 / 2 = 2, kein Rest)
5 % 2 = 1 (5 / 2 = 2.5, Rest ist gerundet 1)

In meinem Beispiel brauchst du auch aktuelle Spalte nicht - die sind nur zur Darstellung.
Mit dem Modulo Test wird hier geprüft ob wir an einem "zehnten" Element sind und dann ein Div erstellt, der wieder ganz links anfängt.

Das ginge aber auch mit CSS "nth-child", also jedes 10te Elemente bekommt ein "clear: left;".
 
Zuletzt bearbeitet:

evillive

EXIL

Registriert
24 Juli 2013
Beiträge
930
@theSplit:

Es geht hier nicht um die Frage ob man dafür OOP braucht oder nicht. Viel eher geht es um den TE der Beispiele die er so findet nicht versteht, weil dort OOP verwendet wird.
 

theSplit

1998
Veteran Barkeeper

Registriert
3 Aug. 2014
Beiträge
28.573
Kapiert habe ich so ziemlich gar nichts. Ich kommentiere das mal entsprechend:
[src=php]
class Auto {

private $Wheels = 5;
private $Doors = 5;
private $EngineStatus = false;
private $Fuel = 1000;
private $Koords = array("x" => 0, "y" => 0);
private $usagePerKM = 0.05;

public function __construct($InitalFuel, $usagePerKM, $Wheels, $Doors, $Koords){ #Warum "InitalFuel"? Oben steht nur "Fuel"? *1
$this->Wheels = in_array($Wheels, array(3, 5, 7, 9) ? $Wheels : 5;
$this->Doors = in_array($Wheels, array(3, 5) ? $Wheels : 5; #Wheels? Warum nicht Doors? Was soll das Fragezeichen? *2
$this->Fuel = $InitialFuel;
$this->Koords = $Koords; # Ist doch das Gleiche? *3
$this->usagePerKM = $usagePerKM;
}

public function Wheels(){
return $this->Wheels; #Wozu? *4
}

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

public function getEngineStatus(){
return $this->EngineStatus;
}

[

public function FuelStatus(){
return $Fuel;
}

# Ab hier Totalausfall. *5
private function distance($point1, $point2){
$res = ($point1[x]-$point2[x]) * ($point1[x]-$point2[x]) + ($point1[y]-$point2[y]) * ($point1[y]-$point2[y]);
return sqrt($res);
}

// [...]

public function fillUp($amount){
$this->Fuel += abs($amount);
}

}
[/src]


Ich versuche dir mal das Beispiel zu erklären, ich hab deinen Fragen Punkte zugewiesen:
*1) folgender Code wird zur Instanzierung genommen, das heißt du erstellst aus einer Klasse eine Instanz.
Sieht wie folgt aus:
[src=php]$meinErstesAuto = new Auto(200, 2, 4, 2, array(12, 14) ) [/src]

Hier wird eine neue Instanz der Klasse Auto erstellt, die Parameter sind das in Klammern, diese werden dann verwendet um die Variablen in
$this->Fuel = Parameter 1 (hier 200), dieser wird in dem Parameter "$initialFuel" übergeben in dem Konstruktur.
$this->Doors = Parameter $Doors an 4erter Stelle, hier "4"
zu setzen.

Also 200 Fuel für $meinErstesAuto und "4" Türen bei Erstellung der Klasse (Erzeugung/Konstruktion => construction, __construct ).

Das $this meint in diesem Fall, das der Wert sich auf eine Variable, vorher mit "private $Wheels = 5", "private $Doors = 5" usw. deklariert, in dieser Klasse bezieht und beim erstellen dann die Parameter verwendet werden soll. Daher auch die Zuweisung über die Parameter an die Variablen in dieser Klasse:
[src=php]$this->Fuel = $InitialFuel;
$this->Koords = $Koords; # Ist doch das Gleiche? *3
$this->usagePerKM = $usagePerKM;[/src]


*Bitte Notiz am Ende des Beitrags lesen, hier bin ich mir nun nicht 100% sicher....

2*) Bei den Variablen Wheels und Doors im Construktor wird folgendes gemacht:
in_array <-- ist ein Wert in einem Array, als Parameter hier das "wo" ($Wheels Parameter) und "was", hier eine Zahl in einem Array von [3, 5, 7, 9] (also eine dieser Zahlen hier enthalten).

Das "?" steht hier für einen Ternary Operator, das ist quasi das selbe wie ein if und funktioniert so:
Prüfe ist X = 0 ? ja/true : nein: false;
Das sieht dann so aus:
[src=php] $x = 0 // Ändere mal x auf irgendwas außer 0, x wird dann 1.5 sein.
$x == 0 ? $x = 0 : $x = 1.5;
echo $x;
[/src]

Man kann es aber auch so schreiben, nur ist es dann kein Einzeiler mehr:
[src=php]
if (x == 0) {
x = 0;
} else {
x = 1.5;
}[/src]
Heißt, ist x == 0?, Ja, dann ist X = 0, wenn nicht, ist x = 1.5 - beide Formen erreichen das selbe Ergebniss, wobei die Ternary Form erst einmal nicht so leicht lesbar ist.

3* )
[src=php]$this->Koords = $Koords;[/src]

Hier wird der Parameter $Koords, also Koordinaten, ein Wert zugewiesen, siehe 1*, hier wäre der Wert für die Koordination für $meinErstersAuto ein Array aus [12, 14].
Das Beispiel ist da etwas schlecht, es ist unklar ob Koords nur eine Zahl ist, ein String "12|14" mit Trenner/Delimeter oder was auch immer.. der Konstruktur gibt keine Auskunft wie und ob es nur eine oder doch mehrere Koordinaten gibt. Weder KoordX, KoordY oder sonst wie... würde ich hier bemängeln.

4*
[src=php]
public function Wheels(){
return $this->Wheels; #Wozu? *4
}

public function Doors(){
return $this->Doors;
}
[/src]

Beide diese Funktionien sind "Getter" - so nennt man das in OOP - eine Getter Funktion dient dazu auf einen Wert einer Klasse zuzugreifen und diesen zu erhalten ("get") - oder auch das Ergebnis einer Funktion die mit Werten/Variablen einer Instanz, hier $meinErstesAuto, arbeitet.
Um also die Anzahl der Räder/Wheels von $meinErstesAuto zu bekommen, würde man folgendes schreiben:
[src=php]$meinErstersAuto.Wheels()[/src]

In OOP gibt es neben einem "Get" also einen Wert bekommen auch das "Set" Prinzip, Setter genannt. Damit setzt man dann werte:
Beispiel:
$meinErstesAuto.setWheels(5);

Ist die Funktion "setWheels" deklariert soll diese dann die Anzahl der Räder mittels:
"$this->Wheels = 5;" - 5 wäre hier mein Parameter, die Funktion müsste man auch so deklarieren:
"public setWheels($numberOfWheels) { $this->Wheels = $numberOfWheels; }
setzen - easy oder?

Diese ganze Getter und Setter Geschichte wurde eigentlich deßhalb eingebürgert (es ist ja nicht Python... :p ) um zu Vermeiden das man Werte einer Klasse direkt setzt oder ausliest, sondern Funktionen dazu dienen mit den hier als "privat" deklarierten Variablen dieser Klasse, zu agieren. Das kann man nun halten wie ein Dachdecker.. obwohl gleich in anderen Beiträgen geschrien wird :D

*5
Das sind genau diese Setter Funktionen, wie auch Funktionen um mit den Werten von Auto Instanzen zu arbeiten/entwickeln.
Schau dir mal die letzte Funktion an:
[src=php] public function fillUp($amount){
$this->Fuel += abs($amount);
}[/src]

Rufst du nun folgendes auf:
[src=php]$meinErstesAuto.fillUp(10);[/src]

dann würde die Variable "Fuel" von "meinErsterAuto" bei "210" liegen, zur Erinnerung:
mit "new Auto(200, ....)" haben wir den Sprit auf 200 festgelegt, dieser Aufruf addiert nochmal 10 hinzu.
Das "abs($amount" also, abs dient nur dazu aus, sagen wir: "-4" immer eine positive Zahl zu machen, also "4" anstelle.

So, lange Rede, kurzer Sinn:
Hast du nun zwei Autos, sagen wir:
$meinErstesAuto = new Auto(200, ........)
und
$meinZweitesAuto = new Auto(250, ..... )

dann wäre der Sprit/Fuel für beide Autos unterschiedlich gesetzt und in Ihnen gespeichert.
Das heißt erstesAuto hätte 200 Fuel/Sprit der Tank von zweitesAuto wäre beim Start auf 250 gesetzt.

Du arbeites also mit zwei Objekten, die absolut andere Parameter und Werte enthalten können und diese geschützt von einander trennen, aber mittels Getter und Setter Funktionen das gleiche "Interface" also die Steuerung mittels Funktionen ist bei beiden Autos gleich.
Also können beide Autos mit ".fillUp($amount)" aufgetankt werden, oder den Motor eines Autos starten: "$auto1.startEngine()", "$auto1.getEngineStatus()" -> Motor an
und das andere ist immernoch bei dem Status, mit dem es mit "new Auto" deklariert worden ist, also "$auto2.getEngineStatus()" --> false / aus.


Nochmal zu "private" Variablen,
Diese sind "privat" für diese Klasse, das heißt man kann NUR über Get und Set Funktionen damit arbeiten, ein direkt Aufruf in etwa mit:
$meinErstesAuto->Fuel, wird nicht funktionieren, dazu müssten sie "public" sein.

Wären die Variable mit "public" deklariert ist, so könnte man auf diese von außen zugreifen, wie im Beispiel eben.

Das gleiche bei Funktionen, "private" (nur für interne Zwecke innerhalb der Klasse), "public" für den Aufruf von außen über die KlassenInstanz.

*Notiz:
Ich weiß jetzt nicht wie PHP das händelt wenn keine Werte in einem Kontruktur gegeben sind,, ich vermute es bricht, kann sein das es diese "private $Wheels = 5; ", also 5, als exakter Wert eines neuen (new) Auto verwendet so fern keine Parameter übergeben werden, vielleicht kann das hier ein PHPler aufklären :) ...

Jedenfalls, wird die Klasse erstellt, dann sind das es immer "private $wheels = 5" jeder Auto Instanz, also 5, so fern der Parameter es nicht ändert.
 
Zuletzt bearbeitet:

Cyperfriend

Der ohne Avatar

Registriert
14 Juli 2013
Beiträge
1.123
  • Thread Starter Thread Starter
  • #35
@evillive: Naja, jetzt habe ich aber gleich mehrere Punkte zu kritisieren
1) Wenn ich im Klartext das so reinschreibe, kann ichs auch gleich in meinem HTML-Dokument belassen. Ich will ja, dass db_standorte variabel gehalten wird, genau wie standort_id, ort und strasse, weil das sind die Dinge, die sich in den Abfrage ändern.

2) Ich will dieses <option>-NICHT im PHP-Code. Es ist ein HTML-Tag und deswegen soll es auch im HTML-Dokument verbleiben.

Edit: Ich denke wir sollten uns jetzt nicht verzetteln. Ich denke es ist klar, dass ich grundlegendes nicht verstanden habe. Ich weis zum Beispiel immer noch nicht, warum ich für meine Karte (um beim vorhaben zu bleiben) OOP nutzen sollte und wie ich das anstellen soll. Ich werde mir später die Mühe machen, mal alles zusammen zu tragen, was die Karte haben muss (Also Höhe, Breite, Gelbe Punkte, rote Punkte und so weiter und trage das dann hier zusammen. Vielleicht kommen wir so voran und ich lerne was.
 

epiphora

aus Plastik
Veteran

Registriert
14 Juli 2013
Beiträge
3.894
Ort
DE-CIX
Genau so könnte man aber argumentieren, dass das ein HTML-Dokument ist und deswegen gehört da kein SQL-Query rein. :)
 

Cyperfriend

Der ohne Avatar

Registriert
14 Juli 2013
Beiträge
1.123
  • Thread Starter Thread Starter
  • #37
Ja, aber wenn ich schon mische, dann wenigstens nur in einem Dokument (und so wenig, aber sinnvoll wie möglich). Im HTML-Dokument werde ich um PHP schlecht herumkommen. Den PHP-Code will ich aber so sauber wie möglich halten.

Außerdem finde ich es doof, wenn da plötzlich eine "Lücke" ist in der dann sowas wie <?php funktionsname ?> steht.

Wenn ich ALLEs ins HTML-Dokument schreibe kann man das wenigstens so begründen, dass es in der logischen Reihenfolge schonmal an der richtigen Stelle ist und man eine Funktion nicht erst in einem anderen Dokument suchen muss.
 

epiphora

aus Plastik
Veteran

Registriert
14 Juli 2013
Beiträge
3.894
Ort
DE-CIX
Um das zu vermeiden, würde man ja grundsätzlich erst mal zu irgendeinem Template-System (oder - noch besser - einem MVC-ähnlichen Design-Pattern) raten. Da gibt es in PHP ja auch nahezu unendlich viele. Das hat dann aber nichts mehr mit der eigentlichen Fragestellung zu tun. :D
 
Zuletzt bearbeitet:

theSplit

1998
Veteran Barkeeper

Registriert
3 Aug. 2014
Beiträge
28.573
[...] Außerdem finde ich es doof, wenn da plötzlich eine "Lücke" ist in der dann sowas wie <?php funktionsname ?> steht.

Wenn ich ALLEs ins HTML-Dokument schreibe kann man das wenigstens so begründen, dass es in der logischen Reihenfolge schonmal an der richtigen Stelle ist und man eine Funktion nicht erst in einem anderen Dokument suchen muss.

Stichwort Funktionsnamen, wenn die Funktion "getStandortId($standort)" ist - dann kann man das de facto auch schon so einbauen da aus dem Namen direkt ersichtlich ist was in dieser Funktionen passiert und zurückgegeben werden soll. - Du kannst es ja auch ganz klassich machen: "getIntStandortId($standort)".

Dagegen wäre: "standortId($standort)" schon wieder ziemlich nichtssagend wenn auch noch irgendwie vom einem Dritten nachvollziehbar.

Nimm doch zum Templaten "Smarty": http://www.smarty.net/
 

Cyperfriend

Der ohne Avatar

Registriert
14 Juli 2013
Beiträge
1.123
  • Thread Starter Thread Starter
  • #40
Kann man meine Abfrage nicht so umschreiben, dass ich alles, was variabel ist, auch variabel verwendbar ist? Das wäre doch schonmal ein Anfang. Dann noch den HTML-Tag aus dem PHP raus und fertig. Klar muss ich dann die Abfrage mit einem <?php { ?> und einem <?php } ?> schließen, aber das würde mir gefallen.

Edit: Wenn euch das total gegen den Strich geht, dann wenigstens variabel bitte.
 
Oben