(file)handle oder (file)pointer
Alex
- php
0 fastix®0 hotti0 Felix Riesterer0 Sven Rautenberg
Hallo,
zunächst einmal möchte ich loswerden, dass ich die folgende Frage nicht aus Kleinkariertheit oder so stelle, sondern lediglich um ein Verständnis für mich zu schaffen, was den überhaupt Griffe (Handle) und Zeiger (Pointer) sind.
Wikipedia hilft mir da nicht wirklich weiter, weil man bei mir* wohl etwas einfacher anfangen muss.
Ich hatte gehofft mir das anhand eines Beispieles herleiten zu können, aber bei fopen beispielsweise scheinen sich die Experten auch nicht wirklich einig zu sein.
Mal wird von einem Handle gesprochen:
<?php
$handle = fopen('somefile.txt', 'r');
fclose($handle);
?>
Dann im gleichen Context wiederum von Zeiger (fp => filepointer)
<?php
$file_pointer = fopen('textfile.dat', 'r');
fclose($file_pointer);
echo '$file_pointer is resource = ' . (is_resource($file_pointer) ? 'true': 'false');
?>
Quelle: http://php.net/manual/de/function.fclose.php
Ist es nun egal. Ist ein Handle und Zeiger gar das Gleiche?
Was ist in dem genannten Beispiel richtig und warum?
Ich stelle mir das so vor:
Öffne ich mit fopen() eine Textdatei (etwa so: fopen("datei.txt", a+) entspricht das in etwa dem "manuellen" Öffnen der Textdatei mit Lese- und Schreibberechtigung und gleichzeitiges Setzen des Cursors ans Ende der Datei.
Was ist jetzt der Handle und/oder Zeiger allgemein und was entspricht dem Handle und/oder Zeiger speziell in dem genannten Beispiel?
___
*PHP-Anfänger, Dilettant, keine Erfahrung mit anderen Programmiersprachen
Moin!
zunächst einmal möchte ich loswerden, dass ich die folgende Frage nicht aus Kleinkariertheit oder so stelle, sondern lediglich um ein Verständnis für mich zu schaffen, was den überhaupt Griffe (Handle) und Zeiger (Pointer) sind.
Philosphiefrage mit Streitpotential. Für mich sieht es auf jeden Fall aus wie ein Relikt aus den Zeiten, bevor die objektorientierte Programmierung erfunden wurde.
MFFG (Mit freundlich- friedfertigem Grinsen)
fastix
hi,
Mal wird von einem Handle gesprochen:
<?php
$handle = fopen('somefile.txt', 'r');
fclose($handle);
?>
>
> Dann im gleichen Context wiederum von Zeiger (fp => filepointer)
Hmm, das ist in der Thad verwirrend. Handle oder Descriptor ist ok, aber Pointer? Letztere haben, zumindest in C überhaupt nichts mit Handles zu thun, ein Pointer in c zeigt auf eine Speicheradresse im RAM. Selbst Referenzen sind keine Pointer in diesem Sinne.
Hotti
Hallo,
Letztere haben, zumindest in C überhaupt nichts mit Handles zu thun
Thunfisch??
ein Pointer in c zeigt auf eine Speicheradresse im RAM. Selbst Referenzen sind keine Pointer in diesem Sinne.
Doch, sind sie. Referenz ist nur eine andere Bezeichnung für Zeiger oder Pointer.
Ciao,
Martin
Lieber Alex,
wie fastix schon angemerkt hat, mag bei manchen heutigen Sprachen diese Unterscheidung konzeptionell schwierig sein, da die Sprachen intern anders arbeiten.
<?php
$handle = fopen('somefile.txt', 'r');
fclose($handle);
?>
Die Variable $handle erhält eine Referenz auf eine Ressource. Das erkennst Du an der Ausgabe von `print_r($handle)`{:.language-php}.
Von daher ist es schwierig hier das Konzept von Handle und Pointer anzuwenden. Handle leuchtet mir ein, Pointer weniger. Aber PHP wird intern für die Referenz zu der Ressource einen Pointer benutzen - und da hast Du nun Deinen nomenklatorischen Salat.
> ~~~php
<?php
> $file_pointer = fopen('textfile.dat', 'r');
> fclose($file_pointer);
> echo '$file_pointer is resource = ' . (is_resource($file_pointer) ? 'true': 'false');
> ?>
Auch hier wird im Grunde eine Ressource an $file_pointer vergeben (s.o.). Dass die Ressource nicht nur einen "Kanal" zu einer Datei bietet, sondern auch noch eine Leseposition in der Datei speichert, macht sie zu mehr als einem Handle im Sinne von "Kanal", aber eben auch mehr als zu einem Pointer im Sinne von "Zeiger auf RAM-Adresse". Auch wenn die Sache mit der "Leseposition" etwas mit Pointer zu tun haben mag, so fehlt beim herkömmlichen Pointer die Sache mit dem Kanal... oder irre ich mich da (bin kein C-Programmierer)?
Ist es nun egal.
Nein, kommt in PHP aber auf dasselbe raus.
Ist ein Handle und Zeiger gar das Gleiche?
Wozu sollte es dann beide Begriffe geben?
Liebe Grüße,
Felix Riesterer.
Lieber Felix,
erstmal vielen Dank für deine schon sehr hilfreiche Antwort
Die Variable $handle erhält eine Referenz auf eine Ressource. Das erkennst Du an der Ausgabe von
print_r($handle)
.
Das mit print_r() hatte ich auch schon als Hilfe genutzt. Hat es mir doch bei dem Verständnis von Arrays schon sehr geholfen. Nur hier brachte es mich nicht wirklich weiter.
Auch hier wird im Grunde eine Ressource an $file_pointer vergeben (s.o.). Dass die Ressource nicht nur einen "Kanal" zu einer Datei bietet, sondern auch noch eine Leseposition in der Datei speichert, macht sie zu mehr als einem Handle im Sinne von "Kanal", aber eben auch mehr als zu einem Pointer im Sinne von "Zeiger auf RAM-Adresse".
Also mit "Kanal" und "Zeiger auf RAM-Adresse" komm ich der Bedeutung von Handle und Pointer zumindest schonmal etwas näher.
Ist ein Handle und Zeiger gar das Gleiche?
Wozu sollte es dann beide Begriffe geben?
Synonyme mit gleicher Bedeutung sollen ja schonmal vorkommen, warum nicht auch in der Programmierung. Wollte es nur ausschließen.
Gruß
Alex
Hi!
Die Variable $handle erhält eine Referenz auf eine Ressource. Das erkennst Du an der Ausgabe von
print_r($handle)
.
Das mit print_r() hatte ich auch schon als Hilfe genutzt. Hat es mir doch bei dem Verständnis von Arrays schon sehr geholfen. Nur hier brachte es mich nicht wirklich weiter.
var_dump() wäre auch bgesser geeignet. Felix will darauf hinaus, dass dann da "Ressource" geschrieben steht. Ressource ist allerdings ein Sammelbegriff und steht auch unter PHP für mehrere Arten von Verwaltungsstrukturen. Um deine Frage zu beantworten halte ich den Begriff nicht weiter für sonderlich hilfreich.
Ist ein Handle und Zeiger gar das Gleiche?
Wozu sollte es dann beide Begriffe geben?
Synonyme mit gleicher Bedeutung sollen ja schonmal vorkommen, warum nicht auch in der Programmierung. Wollte es nur ausschließen.
Ein Zeiger ist nicht viel mehr als ein Verweis auf eine bestimmte Stelle. Und so kann man den Verweis auf eine Datei auch als Zeiger ansehen. Doch um Lese- und Schreiboperationen durchführen zu können, braucht es doch noch etwas mehr Verwaltungsinformation als nur einen Verweis. Deswegen hat man sich wohl gedacht, dass die Bezeichnung Handle da viel besser passt. Zumal man beim Lesen und Schreiben in der Datei auch wieder einen (zweiten) Pointer hat, der auf die gerade aktuell zu lesende oder schreibende Stelle verweist. Dieser Zeiger wird oft nur indirekt (über seek) bedient. Trotzdem will man den nicht mit einem Verweis auf die Datei an sich verwechseln.
Lo!
Hi dedlfix!
Ein Zeiger ist nicht viel mehr als ein Verweis auf eine bestimmte Stelle. Und so kann man den Verweis auf eine Datei auch als Zeiger ansehen. Doch um Lese- und Schreiboperationen durchführen zu können, braucht es doch noch etwas mehr Verwaltungsinformation als nur einen Verweis. Deswegen hat man sich wohl gedacht, dass die Bezeichnung Handle da viel besser passt. Zumal man beim Lesen und Schreiben in der Datei auch wieder einen (zweiten) Pointer hat, der auf die gerade aktuell zu lesende oder schreibende Stelle verweist. Dieser Zeiger wird oft nur indirekt (über seek) bedient. Trotzdem will man den nicht mit einem Verweis auf die Datei an sich verwechseln.
Ich glaube mir fehlt da etwas das abstrakte Denken. Kann ich mir das bildhaft etwa so vorstellen?
Zeiger = Ich zeige auf einen Notizblock.
Will ich nun etwas aus dem Block radieren, reinschreiben oder ähnliches, muss ich diesen schon greifen (Handle).
Letzter Verständnisversuch, danach nehme ich Handle als gegeben hin oder schreibe einfach alles in eine Variable $foo oder so. Problem ist nur, dass ich mir das so einfach nicht merken kann, wenn ich es nur auswendig lerne und nicht verstehe.
Hi!
Ich glaube mir fehlt da etwas das abstrakte Denken. Kann ich mir das bildhaft etwa so vorstellen?
Zeiger = Ich zeige auf einen Notizblock.
Will ich nun etwas aus dem Block radieren, reinschreiben oder ähnliches, muss ich diesen schon greifen (Handle).
Naja, nicht ganz. Ein Zeiger im eigentlichen Sinne zeigt nur auf Speicherstellen. Der Notizblock ist aber ein externes Speichermedium. Mit deiner Analogie wäre ein Zeiger ein Verweis innerhalb deines Gehirns. Im Computer zeigt ein Zeiger zum Beispiel auf den Anfang einer Information (vielleicht eine Zeichenkette). Um im Notizblock etwas festzuhalten brauchst du mehr Daten. Wenn du ihn gefunden hast, musst du ihn mit deinen Augen sehen, must ihn mit deinen Händen aufschlagen, musst die Stelle ausfindig machen, wo die nächste Notiz eingetragen werden kann und ihn am Ende wieder zuklappen. Erst dann kannst du das Handle wieder schließen, das für diese Interaktion mit dem Notitzblock notwendig war. Du und dein Gehirn, ihr macht das zwar intuitiv, aber der Rechner braucht für viele Schritte einige Informationen, und die werden intern alle über das Handle verwaltet.
Letzter Verständnisversuch, danach nehme ich Handle als gegeben hin oder schreibe einfach alles in eine Variable $foo oder so. Problem ist nur, dass ich mir das so einfach nicht merken kann, wenn ich es nur auswendig lerne und nicht verstehe.
Für dich als PHP-Programmierer ist es nicht so wichtig, was das Ding konkret ist, jedenfalls nicht für das Veständnis, was du damit anstellen kannst. Du kannst die Variable auch es als Stellvertreter für die Datei ansehen, die du einigen der f...()-Funktionen mitgeben musst, damit sie alle das gleiche Wissen über die Datei und ihren Bearbeitungszustand bekommen.
Möglichst exakte Begriffe zu verwenden, ist für eine effektive und effiziente Kommunikation wichtig. Jedoch wäre auch "Dateivariable" aus PHP-Programmierer-Sicht eine Bezeichnung, die verstanden werden müsste, wenn es um die f...()-Funktionen geht.
Lo!
Hallo nochmal!
Vielen lieben Dank, dass du dich auf mein Beispiel eingelassen hast. Ich bin jetzt schon wesentlich weiter, was das Verständnis diesbezüglich angeht, als ich das noch vorhin war.
Grüße
Alex
Moin!
Mal wird von einem Handle gesprochen:
<?php
$handle = fopen('somefile.txt', 'r');
fclose($handle);
?>
>
> Dann im gleichen Context wiederum von Zeiger (fp => filepointer)
>
> ~~~php
<?php
> $file_pointer = fopen('textfile.dat', 'r');
> fclose($file_pointer);
> echo '$file_pointer is resource = ' . (is_resource($file_pointer) ? 'true': 'false');
> ?>
Die offizielle PHP-Doku spricht nur von Handles.
Das Pointer-Beispiel, das du da gefunden hast, stammt aus einem User-Kommentar - und wenn der, genauso wie du, die Unterscheidung von Handle und Pointer nicht verstanden hat, erklärt das, warum seine Variablennamen sich von der offiziellen Handhabung unterscheiden.
Ist es nun egal. Ist ein Handle und Zeiger gar das Gleiche?
Es ist sogar total egal. Das Funktionsergebnis von fopen() muss in einer Variablen beliebigen Namens gespeichert werden, um bei Lese/Schreibzugriffen sowie bei fclose() wieder mit angegeben zu werden. Es bezeichnet dabei die jeweils geöffnete Datei.
Ob das nun Handle oder Pointer genannt wird, ist für die Funktion absolut nebensächlich.
Ich bin allerdings für Handle.
- Sven Rautenberg
Moin Sven,
danke für deine Antwort.
Das Pointer-Beispiel, das du da gefunden hast, stammt aus einem User-Kommentar - und wenn der, genauso wie du, die Unterscheidung von Handle und Pointer nicht verstanden hat, erklärt das, warum seine Variablennamen sich von der offiziellen Handhabung unterscheiden.
Das es sich hier um das Beispiel eines Users handelt ist mir klar. Aber auch in Fachbüchern (die ich leider nicht verlinken konnte), finden sich Beispiele mit $fp für FilePointer und da schien mir der Ausdruck schon bewusst gewählt, weil im weiteren Text auch von Zeiger(n) gesprochen wird.
Ist es nun egal. Ist ein Handle und Zeiger gar das Gleiche?
Es ist sogar total egal. Das Funktionsergebnis von fopen() muss in einer Variablen beliebigen Namens gespeichert werden, um bei Lese/Schreibzugriffen sowie bei fclose() wieder mit angegeben zu werden. Es bezeichnet dabei die jeweils geöffnete Datei.
Also wäre es danach richtig (wenn man die Variable möglichst treffend bezeichnen will), die Variable $datei zu nennen?
Ob das nun Handle oder Pointer genannt wird, ist für die Funktion absolut nebensächlich.
Das ist doch unstrittig. Aber den Variablen sinnvolle Namen zu geben ist für mich - gerade als Anfänger - sehr wichtig, um den Quelltext nachvollziehen zu können und deshalb wollte ich es hier gleich richtig machen, um nicht hinterher, wenn mir vlt. mal der Unterschied zwischen Zeiger und Handle klar wird in den A... zu beißen.
Ich bin allerdings für Handle.
Na, wenn die offizielle Doku und du für Handle sind, dürfte die Sache ja eindeutig sein. Vlt. steig ich auch mal hinter dem "warum".
Handle und Zeiger waren für mich einfach zu abstrakt, um mir darunter etwas vorzustellen Henkel wovon, Zeiger worauf? Ein bißchen klarer wurde es mir jetzt zwar, aber ich glaube richtig verstanden habe ich es noch nicht.
Ich danke trotzdem nochmal allen, die auf meinem Beitrag geantwortet haben.
Hi!
Das Funktionsergebnis von fopen() muss in einer Variablen beliebigen Namens gespeichert werden, um bei Lese/Schreibzugriffen sowie bei fclose() wieder mit angegeben zu werden. Es bezeichnet dabei die jeweils geöffnete Datei.
Also wäre es danach richtig (wenn man die Variable möglichst treffend bezeichnen will), die Variable $datei zu nennen?
Eigentlich nicht, denn die Datei liegt auf der Platte und das Ding in der Variable ist eine Verwaltungsstruktur für den Dateizugriff. Noch besser wäre allerdings ein sprechender Name und nicht einfach nur $filehandle, und $filehandle2 wenn du noch eine zweite brauchst.
Ich bin allerdings für Handle.
Na, wenn die offizielle Doku und du für Handle sind, dürfte die Sache ja eindeutig sein. Vlt. steig ich auch mal hinter dem "warum".
Ein Zeiger ist nur ein sehr einfacher Hinweis auf das Ziel. Für den Dateizugriff braucht man mehr Verwaltungsdaten als einen Verweis auf eine Speicherstelle. Mit den Daten in der Verwaltungsstruktur kann man den Dateizugriff handlen, mit einem Zeiger allein geht das nicht.
Lo!