> What it looks like to me is that something is causing $foo to be a
> string before the '$foo[] = "bar";' line is encountered. What do you
> get if you put a gettype($foo); just before that line?
>
> > $foo=null;
> > $foo[]="bar"; // <-- $foo simply becomes an array
NULL. That is the problem. I _did_ put a gettype($foo) before the actual line.
OK, here are exact four lines of my code:
$ret=array();
foreach(self::$_allowed as $r => $a)
if ($a)
$ret[]=$r;
As you can see, there is not a shred of a chance for $ret to become something
other than empty array between initialization and the last line in the above
snippet which causes the fatal errror. There's no __staticGet in 5.2.9, so
self::$_allowed cannot have side effects.
Secondly, the above code starts failing after it has executed successfully
dozens of times (and yes, the last line _does_ get executed; in fact self::
$_allowed contains configuration information that doesn't change at runtime).
Thirdly...
> > The problem is not limited to one place in code, and indeed before the
> > fatal caused by append-assignment I get several warnings like
> > "array_diff_key(): Argument #1 is not an array", where the offending
> > argument receives a result of array().
>
> This would appear to support my suspicion, but try inserting the
> gettype($foo) (or better, var_export($foo);) just before one of the
> lines which triggers the error, and post the results.
No, I don't think it supports your suspicion. Conversely, it indicates that
once array() returns a strangelet, it starts returning strangelets all over
the place. Initially it only triggers warnings but eventually one of the
returned strangelets is used in a way that triggers a fatal error.
As per your request:
//at the beginning of the script:
$GLOBALS['offending_line_execution_count']=0;
// /srv/home/[munged]/public_html/scripts/common.php line 161 and on
// instrumented as per your request:
public static function GetAllowed() {
if (debug_mode()) echo
++$GLOBALS['offending_line_execution_count']."<br/>";
$ret=array();
if (debug_mode()) echo var_export($ret)."<br/>";
foreach(self::$_allowed as $r => $a)
if ($a)
$ret[]=$r;
if (self::$_allowEmpty) $ret[]="";
return $ret;
}
Output tail:
-----------------------------------------------
28
array ( )
29
array ( )
30
array ( )
31
array ( )
32
array ( )
Warning: array_diff_key() [function.array-diff-key]: Argument #1 is not an
array
in /srv/home/u80959ue/public_html/v3/scripts/SimpliciText.php on line 350
Warning: Invalid argument supplied for foreach() in
/srv/home/u80959ue/public_html/v3/scripts/SimpliciText.php on line 351
Warning: array_merge() [function.array-merge]: Argument #2 is not an array in
/srv/home/u80959ue/public_html/v3/scripts/SimpliciText.php on line 357
Warning: Invalid argument supplied for foreach() in
/srv/home/u80959ue/public_html/scripts/common.php on line 28
Warning: Invalid argument supplied for foreach() in
/srv/home/u80959ue/public_html/scripts/common.php on line 28
Warning: Invalid argument supplied for foreach() in
/srv/home/u80959ue/public_html/scripts/common.php on line 28
33
NULL
Fatal error: [] operator not supported for strings in
/srv/home/u80959ue/public_html/scripts/common.php on line 168
--------------------------------------------------
The warnings come from other uses of array().
But wait! There is this invocation of debug_mode() between initialization of
$ret var_export. Let's factor it out to be safe:
$debugmode=debug_mode();
if ($debugmode) echo
++$GLOBALS['offending_line_execution_count']."<br/>";
$ret=array();
if ($debugmode) echo var_export($ret)."<br/>";
And now the output ends with:
------------------------------------
Warning: Invalid argument supplied for foreach() in
/srv/home/u80959ue/public_html/scripts/common.php on line 28
33
Fatal error: [] operator not supported for strings in
/srv/home/u80959ue/public_html/scripts/common.php on line 169
------------------------------------
No NULL after 33? What the heck is going on? Does array() now return something
that var_exports to an empty string, or does it destroy local variables? Let's
see:
if ($debugmode) echo var_export($ret)."<br/>"; else echo
"WTF?!?!?<br/>";
And the output:
------------------------------------
Warning: Invalid argument supplied for foreach() in
/srv/home/u80959ue/public_html/scripts/common.php on line 28
33
WTF?!?!?
Fatal error: [] operator not supported for strings in
/srv/home/u80959ue/public_html/scripts/common.php on line 169
---------------------------------------
Indeed, the use of array(), once it starts misbehaving, wreaks havoc in the
local scope (possibly including the variable to which its result is assigned).
> Can you post the code in a .zip file or online somewhere?
Unfortunately not.
Szczepan Holyszewski
--
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php