PHP-Problem

PHP-Problem

am 27.11.2005 19:58:09 von Holger Barlmeyer

Hallo zusammen,
ich habe ein Problem, ich habe ein Update von PHP4.3.10 auf PHP4.4.0
lief auch alles ganz easy.
Nun bekomme ich aber folgende Warnmeldung:

Notice: Only variable references should be returned by reference in
/musterpfad/adodb/adodb.inc.php on line 754

Kann mir einer von euch helfen?

Gruß Holger

Re: PHP-Problem

am 27.11.2005 20:15:31 von Niels Braczek

Holger Barlmeyer schrieb:

> ich habe ein Problem, ich habe ein Update von PHP4.3.10 auf PHP4.4.0
> lief auch alles ganz easy.
> Nun bekomme ich aber folgende Warnmeldung:
>
> Notice: Only variable references should be returned by reference in
> /musterpfad/adodb/adodb.inc.php on line 754
>
> Kann mir einer von euch helfen?

Tja, ärgerlich... damit schlage ich mich auch gerade herum.
Das liegt daran, dass es plötzlich nicht mehr erlaubt ist, NULL oder das
Ergebnis einer Funktion als Referenz zurückzugeben. Meistens ist es ein
Konstrukt wie

function &myfunc
{
...
if (is_error(...)) {
return null;
}
...
}

Abhilfe:

if (is_error(...)) {
$null = null;
return $null;
}

Ob das nun ein Bug oder ein Feature ist, wage ich noch nicht zu beurteilen.

MfG
Niels

--
| http://www.kolleg.de · Das Portal der Kollegs in Deutschland |
| http://www.bsds.de · BSDS Braczek Software- und DatenSysteme |
| Webdesign · Webhosting · E-Commerce · Mambo Content Management |
`----------------------------------------------------------- -----´

Re: PHP-Problem

am 27.11.2005 22:50:12 von Helmut Chang

Niels Braczek schrieb:

> Tja, ärgerlich... damit schlage ich mich auch gerade herum.
> Das liegt daran, dass es plötzlich nicht mehr erlaubt ist, NULL oder das
> Ergebnis einer Funktion als Referenz zurückzugeben. Meistens ist es ein
> Konstrukt wie
>
> function &myfunc
> {
> ...
> if (is_error(...)) {
> return null;
> }
> ...
> }
>
> Abhilfe:
>
> if (is_error(...)) {
> $null = null;
> return $null;
> }
>
> Ob das nun ein Bug oder ein Feature ist, wage ich noch nicht zu beurteilen.

In diesem Zusammenhang farge ich einfach mal:

Was ist denn der Unterschied zwischen:

function &myfunc {
...
if (is_error(...)) {
return null;
}
...
}

und

function &myfunc {
...
if (is_error(...)) {
return;
}
...
}

Und gibt zweiteres auch diese Notice?

gruss, heli

Re: PHP-Problem

am 27.11.2005 23:34:21 von Niels Braczek

Helmut Chang schrieb:

> In diesem Zusammenhang farge ich einfach mal:
>
> Was ist denn der Unterschied zwischen:
>
> function &myfunc {
> ...
> if (is_error(...)) {
> return null;
> }
> ...
> }

Hier wird ein Wert zurückgegeben, ...

> und
>
> function &myfunc {
> ...
> if (is_error(...)) {
> return;
> }
> ...
> }

.... hier jedoch nicht.

> Und gibt zweiteres auch diese Notice?

Ich habe es jetzt zwar nicht ausprobiert, aber wenn ich PHP wäre, hätte
ich bei

$var =& myfunc();

ein Problem, wenn myfunc() keinen Wert liefert. Hier würde ich nicht nur
eine Notice erwarten, sondern einen Fatal error.

MfG
NIels

--
| http://www.kolleg.de · Das Portal der Kollegs in Deutschland |
| http://www.bsds.de · BSDS Braczek Software- und DatenSysteme |
| Webdesign · Webhosting · E-Commerce · Mambo Content Management |
`----------------------------------------------------------- -----´

Re: PHP-Problem

am 28.11.2005 01:24:33 von Holger Barlmeyer

Niels Braczek schrieb:
> Helmut Chang schrieb:
>
>
>>In diesem Zusammenhang farge ich einfach mal:
>>
>>Was ist denn der Unterschied zwischen:
>>
>>function &myfunc {
>> ...
>> if (is_error(...)) {
>> return null;
>> }
>> ...
>>}
>
>
> Hier wird ein Wert zurückgegeben, ...
>
>
>>und
>>
>>function &myfunc {
>> ...
>> if (is_error(...)) {
>> return;
>> }
>> ...
>>}
>
>
> ... hier jedoch nicht.
>
>
>>Und gibt zweiteres auch diese Notice?
>
>
> Ich habe es jetzt zwar nicht ausprobiert, aber wenn ich PHP wäre, hätte
> ich bei
>
> $var =& myfunc();
>
> ein Problem, wenn myfunc() keinen Wert liefert. Hier würde ich nicht nur
> eine Notice erwarten, sondern einen Fatal error.
>
> MfG
> NIels
>
Also danke Niels,
du hast mit deiner Info richtig gelegen.
Danke dir für deine schnelle Antwort

Was ich aber nicht richtig verstehe warum sie dieses implementiert haben
:-()

Re: PHP-Problem

am 28.11.2005 01:54:18 von Niels Braczek

Holger Barlmeyer schrieb:

> Also danke Niels,
> du hast mit deiner Info richtig gelegen.
> Danke dir für deine schnelle Antwort

Da nich' für, wie man bei uns sagt.

> Was ich aber nicht richtig verstehe warum sie dieses implementiert haben
> :-()

Damit bist du nicht allein ;-)
Teilweise macht die Meldung schon Sinn, nur gibt es leider keine leeren
References mehr. Und das ist mindestens schade, wenn nicht gar ein Bug.

MfG
Niels

--
| http://www.kolleg.de · Das Portal der Kollegs in Deutschland |
| http://www.bsds.de · BSDS Braczek Software- und DatenSysteme |
| Webdesign · Webhosting · E-Commerce · Mambo Content Management |
`----------------------------------------------------------- -----´

Re: PHP-Problem

am 28.11.2005 17:08:26 von Sven Drieling

Holger Barlmeyer wrote:

Hallo,

[Rückgabe von Referenzen ab PHP 4.4]

> Was ich aber nicht richtig verstehe warum sie dieses implementiert ha=
ben
> :-()

Ansonsten kann es unter PHP zum Zerstören von Speicherbereichen
kommen. Um dies zu verhindern wurde mit PHP 4.4 dieser Bugfix
eingeführt.

--- schnipp ---
PHP 4.4. Release Announcement
http://www.php.net/release_4_4_0.php

The PHP Development Team would like to announce the immediate release o=
f PHP
4.4.0.=20

This is a maintenance release that addresses a serious memory corruptio=
n
problem within PHP concerning references. If references were used in a =
wrong
way, PHP would often create memory corruptions which would not always
surface or be visible. In other cases it could cause variables and obje=
cts
to change type or class unexpectedly. If you encountered strange behavi=
or
like this, this release might fix it. The increased middle digit was
required because the fix that corrected the problem with references cha=
nged
PHP's internal API, breaking binary compatibility with the PHP 4.3.* se=
ries.
This means that all binary extension modules need to be recompiled in o=
rder
to work with this release.=20

As part of the solution for the reference bug, you are very likely to f=
ind
that your own or third-party PHP scripts, considered 'clean' code under=

previous versions of PHP, will now throw an E_NOTICE when references ar=
e
incorrectly used in the script. This is intended to alert developers to=

minor errors in their approach, and does not affect the script's perfor=
mance
in any other way.=20

Besides the reference problem, this release also fixes numerous other b=
ugs,
including a small security problem with our bundled shtool.=20

Bugfix release
- Memory corruptions with references.
- Small security problem with bundled shtool.

For a full list of changes in PHP 4.4.0, see the ChangeLog.
--- schnapp ---


Mit PHP 6 wird sich auch einiges ändern, so ist u.a. geplant
register_globals, magic quotes und die {}-Schreibweise zum Zugriff auf
einzelne Zeichen eines Strings fallen zu lassen, um PHP damit aufzurä=
umen
und klarer zu strukturieren.

Richard Davey, "Prepare for PHP 6", 23-Nov-2005, Core PHP
http://www.corephp.co.uk/archives/19-Prepare-for-PHP-6.html

Minutes PHP Developers Meeting
http://www.php.net/~derick/meeting-notes.html


tschuess
[|8:)

Re: PHP-Problem

am 28.11.2005 19:44:06 von Helmut Chang

Niels Braczek schrieb:

>> return null;
>
> Hier wird ein Wert zurückgegeben, ...
>
>> return;
>
> ... hier jedoch nicht.

Hmm... sagt:

| The special NULL value represents that a variable has no value.

Davon ausgehend, behaupte ich, auch ein "return null" gibt keinen Wert
zurück und beide sind gleichzusetzen.

Es kommt ja auch hier das gleiche raus:

$foo;
$bar = null;

var_dump($foo);
var_dump($bar);
?>

> Ich habe es jetzt zwar nicht ausprobiert, aber wenn ich PHP wäre, hätte
> ich bei
>
> $var =& myfunc();
>
> ein Problem, wenn myfunc() keinen Wert liefert. Hier würde ich nicht nur
> eine Notice erwarten, sondern einen Fatal error.

Mangels PHP 4.4 kann ich das jetzt auch grad nicht testen.

gruss, heli

Re: PHP-Problem

am 28.11.2005 20:10:10 von Niels Braczek

Helmut Chang schrieb:
> Niels Braczek schrieb:
>
>>> return null;
> >
>> Hier wird ein Wert zurückgegeben, ...
>>
>>> return;
> >
>> ... hier jedoch nicht.
>
> Hmm... sagt:
>
> | The special NULL value represents that a variable has no value.
>
> Davon ausgehend, behaupte ich, auch ein "return null" gibt keinen Wert
> zurück und beide sind gleichzusetzen.

Es ist ein Unterschied, ob ich die Information 'kein gültiger Wert
vorhanden' oder gar keine Information bekomme. In einer Funktion, die
einen Wert zurückliefern soll, sehe ich in einem return ohne Parameter
einen Syntax-Fehler. Aber YMMV, ich komme aus der etwas[tm] strengeren
C-Welt und sehe das daher vielleicht zu eng.

MfG
Niels

--
| http://www.kolleg.de · Das Portal der Kollegs in Deutschland |
| http://www.bsds.de · BSDS Braczek Software- und DatenSysteme |
| Webdesign · Webhosting · E-Commerce · Mambo Content Management |
`----------------------------------------------------------- -----´

Re: PHP-Problem

am 30.11.2005 22:05:51 von Helmut Chang

Niels Braczek schrieb:

> Es ist ein Unterschied, ob ich die Information 'kein gültiger Wert
> vorhanden' oder gar keine Information bekomme.

Es ließe sich darüber streiten, wie die Information "kein gültiger Wert"
auszusehen hat: null oder false (wie dass die meisten nativen
PHP-Funktionen machen).

Abgesehen davon - wenn du in PHP null zurückgibst, bekommst du auch
genau keine Information:

function a {
return;
}

function b {
return;
}

$a = a();
$b = b();

print is_null($a);
print is_null($b);

> In einer Funktion, die
> einen Wert zurückliefern soll, sehe ich in einem return ohne Parameter
> einen Syntax-Fehler. Aber YMMV, ich komme aus der etwas[tm] strengeren
> C-Welt und sehe das daher vielleicht zu eng.

Mein Ansatz ist eher Typsicherheit bzw. Exceptions. In PHP 5 würde mir
spontan kein Fall einfallen, wo ich null zurückgeben müsste. Entweder
gibt die Methode/Funktion einen Wert von genau dem erwarteten Typ
zurück, oder sie wirft eine Exception, d. h. es wird vorzeitig ausgestiegen.

Auch in PHP4 mach ich das nur, wenn ein Fehler auftritt. In diesem Fall
möchte ich aber nicht 'kein gültiger Wert' mit 'return null;' anzeigen,
sondern 'Abbruch auf Grund eines Fehlers' mit 'return;'.

Anhand des ursprünglichen Beipielcodes nahm ich eine ähnliche Intention an.

gruss, heli

Re: PHP-Problem

am 01.12.2005 00:19:31 von Niels Braczek

Helmut Chang schrieb:

> Auch in PHP4 mach ich das nur, wenn ein Fehler auftritt. In diesem Fall
> möchte ich aber nicht 'kein gültiger Wert' mit 'return null;' anzeigen,
> sondern 'Abbruch auf Grund eines Fehlers' mit 'return;'.

Es kommt aber schon mal vor, dass zB. zu bestimmten Kriterien keine
Daten in der Datenbank vorhanden sind. Eine Funktion, die mir alle
Datensätze als multidimensionales Array liefern soll, hat für diesen
Fall doch den natürlichen[tm] Rückgabewert null. Alles andere ist doch
semantisch falsch - oder etwa nicht?

MfG
Niels

--
| http://www.kolleg.de · Das Portal der Kollegs in Deutschland |
| http://www.bsds.de · BSDS Braczek Software- und DatenSysteme |
| Webdesign · Webhosting · E-Commerce · Mambo Content Management |
`----------------------------------------------------------- -----´

Re: PHP-Problem

am 01.12.2005 11:59:50 von Helmut Chang

Niels Braczek schrieb:
> Helmut Chang schrieb:
>
>
>>Auch in PHP4 mach ich das nur, wenn ein Fehler auftritt. In diesem Fall
>>möchte ich aber nicht 'kein gültiger Wert' mit 'return null;' anzeigen,
>>sondern 'Abbruch auf Grund eines Fehlers' mit 'return;'.
>
>
> Es kommt aber schon mal vor, dass zB. zu bestimmten Kriterien keine
> Daten in der Datenbank vorhanden sind. Eine Funktion, die mir alle
> Datensätze als multidimensionales Array liefern soll, hat für diesen
> Fall doch den natürlichen[tm] Rückgabewert null. Alles andere ist doch
> semantisch falsch - oder etwa nicht?

Ich weiß nicht. Wenn ich eine Funktion habe, von der ich erwarte, dass
sie mir ein Array, eine Liste, etc. (halt eine Iterable quasi), erwarte
ich mir, dass in so einem Fall genau dieses Iterable ohne Elemente
zurückgegeben wird.

Wäre doch semantisch mindestens genauso richtig. Und auch einfacher
weiterzuverarbeiten: Ich kann mich immer darauf verlassen, dass ich über
das "Objekt" iterieren kann.

Was anderes ist der Fall, wenn nur ein Datensatz zurückgegeben werden
soll/darf/kann. Was soll dann passieren, wenn dieser Datensatz nicht
gefunden werden kann? Spontan fällt mir dazu ein, dass dies im
Normalfall nicht passieren sollte, das derartige Abfragen normalerweise
darauf abzeilen, zu einem bereits bekannten Schlüssel die Payload zu
holen. Ist das nicht erflogreich, wäre dass IMHO ja eher wieder eine
Exception-Fall, womit sich der Kreis schließt.

gruss, heli

Re: PHP-Problem

am 01.12.2005 15:19:37 von Niels Braczek

Helmut Chang schrieb:
> Niels Braczek schrieb:

>> Es kommt aber schon mal vor, dass zB. zu bestimmten Kriterien keine
>> Daten in der Datenbank vorhanden sind. Eine Funktion, die mir alle
>> Datensätze als multidimensionales Array liefern soll, hat für diesen
>> Fall doch den natürlichen[tm] Rückgabewert null. Alles andere ist doch
>> semantisch falsch - oder etwa nicht?
>
> Ich weiß nicht. Wenn ich eine Funktion habe, von der ich erwarte, dass
> sie mir ein Array, eine Liste, etc. (halt eine Iterable quasi), erwarte
> ich mir, dass in so einem Fall genau dieses Iterable ohne Elemente
> zurückgegeben wird.
>
> Wäre doch semantisch mindestens genauso richtig. Und auch einfacher
> weiterzuverarbeiten: Ich kann mich immer darauf verlassen, dass ich über
> das "Objekt" iterieren kann.

Ja, da hast du Recht. Das gilt allerdings nicht für Nicht-Iterable.

> Was anderes ist der Fall, wenn nur ein Datensatz zurückgegeben werden
> soll/darf/kann. Was soll dann passieren, wenn dieser Datensatz nicht
> gefunden werden kann? Spontan fällt mir dazu ein, dass dies im
> Normalfall nicht passieren sollte, das derartige Abfragen normalerweise
> darauf abzeilen, zu einem bereits bekannten Schlüssel die Payload zu
> holen. Ist das nicht erflogreich, wäre dass IMHO ja eher wieder eine
> Exception-Fall, womit sich der Kreis schließt.

Naja, da ist schnell ein Beispiel gefunden:
Wohnung -> Mieter.
Eine Wohnung hat genau einen Mieter (eine Mietpartei), wenn sie denn
gerade vermietet ist.

MfG
Niels

--
| http://www.kolleg.de · Das Portal der Kollegs in Deutschland |
| http://www.bsds.de · BSDS Braczek Software- und DatenSysteme |
| Webdesign · Webhosting · E-Commerce · Mambo Content Management |
`----------------------------------------------------------- -----´