Php

Hey PHP Programmierer,

ich brauche dringend Rat von dir.

Und zwar habe ich eine function nennen wir sie test().

In dieser func. gibt es zwei params die default Werte besitzen:

test($pfad = "/dir/dir/, $param = „string“)

Ich will wenn ich die test() aufrufe nur dem 2. parameter einem wert zuweisen, der 1. soll den standart wert nehmen.
Das problem ist das bei test(’’, „andererString“) der $pfad leer ist, gibt es eine möglichkeit der funktion das zu sagen ohne auf einen leeren string zu überprüfen?

Vielen Dank für deine Hilfe

Gruß Head

Hallo Head,

es gibt mehrere Möglichkeiten dies über einen Umweg zu realisieren.
Zuerst könntest du versuchen statt einem leeren String einfach (ohne Anführungszeichen!) null zu übergeben.
Wenn das nicht hilft, dann kannst du die Reihenfolge der Parameter einfach umdrehen, so dass du einfach test(„andererString“) aufrufst.

Oder du prüfst in der Funktion direkt am Anfang if(empty($pfad)) { $pad = „/dir/dir/“;} und dann kommt der Rest der Funktion.

Ich hoffe, ich konnte dir bei deinem Problem helfen.

Gruß
taaz

Vielen Dank für die schnelle Antwort.
Wenn ich null versuche gibt er mit trotzdem „“ aus.
Die Möglichkeit das zu verdrehen ist klever, daran habe ich nicht gedacht, aber mein Problem wäre nicht gelöst wenn es mehrer parameter gebe.

Und die Abrage wollte ich vermeiden, da ich gerne wüsste ob es auch mit einer anderen Möglichkeit geht

Gruß Head

Hallo Head

Du musst den ersten Parameter als „null“-Wert übergeben:

test(null, "zweiter Parameter");

Gruss tschuegge

Hallo tschuegge,

danke für die Antwort.
leider gibt mir die Funktion null zurück wenn ich null als Parameter angebe:

test($test = „Hallo“)
{
var_ump($test);
}

test(null);

die funktion gibt „null“ zurück, sollte aber nach deiner Aussage „Hallo“ zurückgeben.

Gruß Sanny

Sorry, da habe ich mich geirrt. Es werden wirklich keine Default-Werte von
Parametern geladen, wenn der Parameter angegeben wird! Ich habe jede
erdenkliche Möglichkeit ausprobiert und es funktioniert keine. Möglicherweise, da
PHP intern die Anzahl übergebener Parameter abfragt und anschliessen die
fehlenden Parameter mit den Default-Werten auffüllt.

Hier ein Codebeispiel wie das Problem laut PHP-Dokumentation gelöst werden
kann:

function some\_function($v1='value1',$v2='value2',$v3='value3'){
 var\_dump(is\_null($v1)?'value1':blush:v1);
 var\_dump(is\_null($v2)?'value2':blush:v2);
 var\_dump(is\_null($v3)?'value3':blush:v3);;
}

Anscheinend gibt es keine „schönere Lösung“.

Gruss tschügge

Hallo Head,

ok, das mit null war nur so eine schnelle Idee.
Außer dem Vertauschen von Parametern und der nachträglichen Abfrage fallen mir keine Möglichkeiten ein.

Ich finde es allerdings nicht zu aufwändig, das über den Umweg der zweiten Abfrage zu machen, wenn es mehrere Parameter gibt.

Evtl. kannst du noch andere hier Fragen, falls du dich damit nichz zufrieden geben möchtest :wink:

Falls du eine Möglichkeit findest, die deinen Vorstellungen entspricht, würde ich mich freuen, wenn du mir die auch mitteilen würdest, da ich hin und wieder schon über dieses Problem nachgedacht habe :wink:

Gruß
Timo

Hey Timo,

bei einem Parameter wo ein String erwartet wird, wird ein leerer String ausgegeben wenn null übergeben wird.

Soweit wie ich es auch von jemand anderen erfahren habe, gibt es keine andere Möglichkeit den Parameter zu umgehen ausser einer Abfrage wie:

functiome_function($v1=‚value1‘,$v2=‚value2‘,$v3=‚value3‘){
var_dump(is_null($v1)?‚value1‘:blush:v1);
var_dump(is_null($v2)?‚value2‘:blush:v2);
var_dump(is_null($v3)?‚value3‘:blush:v3);;
}

das ist ein Codeausschnitt wie die PHP Dokumentation hergibt. So wie du es schon ähnlich hattest :wink:.

Ich hoffe das das noch iwann erweitert wird :wink:.

Gruß Sanny

Hi Head,

das ist leider so nicht möglich. Was du natürlich machen kannst, ist einfach auch wieder den default-Wert zu übergeben (test(„dir/dir“, "test); o.Ä.).
Bei der Gestaltung solcher Funktionen empfiehlt es sich grundsätzlich immer, die Reihenfolge der Paramter so zu wählen, dass man möglichst selten den Default-Paramter übergeben muss. In deinem Fall hieße das, die Reihenfolge der Parameter zu vertauschen, falls du normalerweise den jetzigen ersten Parameter mit Default-Wert ansprichst, den zweiten jedoch nicht.

Zur Vereinfachung könntest du an dieser Stelle mit einer Konstanten arbeiten:
define(„DEF_VAL“, „/dir/dir/“);
function test($pfad = DEF_VAL, $param = „string“)
{
// Mach was
}

test(DEF_VAL, "test);

Damit ersparst du dir den eventuell sehr lang geratenen ersten Paramater dauernd neu tippen zu müssen.

Ich hoffe, damit wenigstens ein wenig helfen zu können, auch wenn die Antwort „geht nicht“ meist nicht so befriedigend ist.

Beste Grüße,

Björn

Hi Sanny,

danke für die Info.

Das ist aber eine schöne kurze Schreibweise, wie ich nich ohne weiteres zur HAnd gehabt hätte :smile:

Gruß
Timo

Genau Timo,

diese kurze Art von IF-Abfragen hätte ich genutzt wenn ich keine andere Möglichkeit gesehen hätte.

Es gibt aber noch natürlich die Möglichkeit nicht jedesmal den Default Wert mit anzugeben. Schau dir mal das nächste Bsp. an :wink: :

define(„DEF_VAL“, „/dir/dir/“);
function test($pfad = DEF_VAL, $param = „string“)
{
// Mach was
}

test(DEF_VAL, "test);

Danke Björn für deine Antwort.
Du bestätigst damit das es leider keine andere Möglichkeit gibt mit Define oder einer kurzen if-Abfrage zu arbeiten.

Dein Tipp würde mir an der Stelle helfen, danke dir.

Gruß Head

Hallo Head,

Grundsätzlich funcktioniert das leider nicht. In der PHP-Hilfe steht:
„Bitte beachten Sie, dass alle Vorgabewerte rechts von den Nicht-Vorgabeparametern stehen sollten; - sonst wird es nicht funktionieren.“

Einen Workaround gibt es allerdings. Versuche, die Funktion mal so zu schreiben:

function test($pfad=null, $param=null) {
if (is_null($pfad)) {
$pfad="/dir/dir/";
}
if (is_null($param)) {
$param=„string“;
}

}

Somit kannst du folgende Funktionsaufrufe verwenden:
test();
test(‚eins‘);
test(null, ‚zwei‘);
test(‚eins‘, ‚zwei‘);

lg,
Michael

Hallo Michael,

danke für deine Antwort.
Genau das wollte ich wissen ob es geht oder nicht. Eine Abfrage wollte ich dadurch vermeiden. Ansonsten hätte ich auch die Möglichkeit der if-kurz-schreibweise genutzt. Die Vorgabewerte rechts zu schreiben werde ich mir aber merken :wink:

Danke dir

Nein, ich denke nicht, dass das geht. Drehe doch einfach die Parameter herum?

Hallo Head,

da ist mir keine Lösung bekannt. Ich würde es folgendermaßen machen:

function test ($a,$b) {
if ($a == null) $a = „text“;
if ($b == null) $b = „bla“;
}

Hat es einen bestimmten Grund, warum du keine if-Abfrage willst?

Grüße MD

Hallo Max,

einen bestimmten Grund gibt es nicht. Ich will lediglich, so wie jeder Programmierer, den Code möglichst ordentlich bzw. kurz halten.

Da ich mittlerweile erfahren habe, dass es keine andere Möglichkeit gibt als mit einer If-Abfrage, oder Konstanten zu arbeiten würde ich auch die kurzschreibweise empfehlen:

$pfad = ($pfad=="")?„string“:blush:pfad;

Hallo Head,

$pfad = ($pfad=="")?„string“:blush:pfad;

die schreibweise mag kompakter erscheinen, dennoch ist sie es nicht. Zum Einen musst du mehr Zeichen tippen und du bekommst jedes mal einen Umspeichervorgang, auch wenn er eigentlich nicht notwendig ist.

Des weiteren würde ich nicht auf leeren String prüfen, sondern auf null. Das spart Arbeitsspeicher, ist schneller und verlagert die Fehlerprüfung auf Übergabe eines korrekten Pfades weg von den Übergabeparametern zu dem Abschnitt im Code, wo es sinnvoll ist. Dadurch wird die Unterscheidung zwischen gewolltem Auslassen des Pfades und fehlerhafter Übergabe, also Fehler in vorangegangen Abschnitten, möglich.

Grüße

Hallo Max,

danke für deine Antwort. Sie war sehr aufklärend in vielen Bereichen.

Gruß Head