Seite 1 von 1

Funktionen und Referenzen

Verfasst: 21.01.2009 15:14
von Nili76
Hi,

ich bin seit kurzem dabei und versuche mich in PHPBB3 einzuarbeiten.
Mein erstes PRojekt sollte sein, dass ich die LDAP-Anmeldung und die normale DB-Anmeldung zusammenbringe.

Einige Nutzer haben einen LDAP-User, andere (der Admin) nicht. Hierzu habe ich in der Users-Tabelle eine Spalte angelegt, die ich in der auth_ldap abfrage.... Wird festgestellt, dass der User sich über LDAP anmelden soll, wird die LDAP-Abfrage weiter ausgeführt.... Steht da aber, dass die normale db genommen werden soll, hatte ich vor

Code: Alles auswählen

if ($row['user_auth_db'] == true)
	{
	include('auth_db.php');
	return login_db($username,$password) 
	}
zu schreiben.

Man stelle sich vor... das klappt sogar... Nur hätte ich zwei Bitten:

1.) Ich würde gerne von euch ein paar Meinungen zur Denkweise von mir haben, wie ich mit den Funktionen umgehe....
Z.B. ist das ok, dass ich so eine include Anweisung in einer Funktion nehme oder sollte ich fast den kompletten Code einfügen, um 2 If Sätze und eine SQL Abfrage weniger zu haben? (unsauber/verboten/geht so... kann man besser machen, indem...)

2.) Frage zu Referenzen in Funktionsaufrufen:

Hab ich das richtig verstanden, dass ich bei einer Funktion wie

Code: Alles auswählen

function login_db(&$username, &$password)
{
...
}
(Beispiel aus der auth_db.php)

die Referenz zu $username und $password übergeben wird und ich mit

Code: Alles auswählen

$username = 'ein ganz anderer'
direkt die Variable ändere, ohne, dass sie der Funktion per global bekannt gemacht wurde?

Denn nur so erkläre ich mir, warum ich in meinem ersten Codebeispiel die Funktion login_db($username,$password) aufrufe und die Funktion selber mit & davor deklariert sind...

Ich habe auch ein wenig gegoogelt, aber mir fehlen noch die richtigen Schlagwörter, um ein nettes Tutorial zu sehen, die mir veranschaulicht, was &$Variable in einer Funktionsdeklaration zu tun hat.

Gruß
Nils

Re: Funktionen und Referenzen

Verfasst: 22.01.2009 22:56
von gn#36
Zur ersten Frage: Du kannst sicherlich dynamisch einbinden abhängig davon was ausgeführt wird. Performancemäßig könnte das sogar Vorteile haben, denn der Parser muss nicht den unnötigen Code parsen und dann ausführen sondern nur den den er auch braucht. Du solltest aber sicherstellen dass im Zweifelsfall die Authentifizierung fehlschlägt, also entweder eine der beiden Methoden erzwingen (if und else nicht elseif) oder im zweifelsfall einfach einen Authentifizierungsfehler zurückgeben. Auch wenn du vielleicht nicht planst mehr Möglichkeiten in der DB zu haben sollte man mögliche Probleme aufgrund von Datenfehlern bei solchen Sachen programmtechnisch möglichst schon von vorne herein ausschließen. (ob du das gemacht hast oder nicht weiß ich nicht, ich wollte es nur mal anmerken)

Zur zweiten Frage: Eine Referenz sorgt dafür dass du die Variable so verarbeiten kannst wie die Variable die du der Funktion übergeben hast. Ändert sie sich in der Funktion, dann ist sie auch im Programmablauf nach dem Funktionsende weiterhin mit dem veränderten Wert ausgestattet. Beim call by value dagegen wird der Wert übergeben, du kannst damit anstellen was du willst innerhalb der Funktion, außerhalb der Funktion wird sich dadurch nichts am Wert ändern. Eine Referenz sollte man möglichst auch bei größeren Strukturen übergeben die nicht verändert werden müssen, da dann nur eine Adresse an die Funktion weitergegeben werden muss und nicht die (übertrieben) 20 MB die an der Adresse gespeichert ist. Wie sehr das bei PHP relevant ist bin ich mir gerade nicht sicher, bei anderen Programmiersprachen (wie z.b. C(++)) kann das aber den Ablauf deutlich beschleunigen wenn man viele Funktionsaufrufe (z.b. in einer Schleife) im Programm hat.

Re: Funktionen und Referenzen

Verfasst: 26.01.2009 14:06
von Nili76
Herzlichen Dank für die Antwort. Du hasst mir damit ein paar Denkanstöße gegeben und gleichzeitig mir die Bestätigung gegeben, dass ich auf dem richtigen Weg bin, php und c++ zu verstehen.

Gruß
Nils