私のオープンソースプロジェクトは、6か月の休憩の後、作業を開始するまでは問題なく機能していました。最新のXAMPPに更新され、大量の奇妙なエラーが発生し始めます。そのうちの1つは次のとおりです。
私はInputクラスを持っており、呼び出し元のメソッドは次のとおりです。
<?php
class Input
{
public function __call ( $name , $arguments )
{
if ( !in_array( $name, array( "post", "get", "cookie", "request", "server", "env" ) ) )
{
throw new Exception( "Input::" . $name . "() not declared!" );
}
$_name_of_superglobal = "_" . strtoupper( $name );
$_max_iteration_level_for_cleanup = in_array( $name, array( "server", "env" ) ) ? 1 : 10;
# $arguments[0] is the index of the value, to be fetched from within the array.
if ( !empty( $arguments[0] ) and array_key_exists( $arguments[0], $this->$name ) )
{
return $this->$name[ $arguments[0] ];
}
elseif ( !empty( $arguments[0] ) and array_key_exists( $arguments[0], $GLOBALS[ $_name_of_superglobal ] ) )
{
return $this->$name[ $this->clean__makesafe_key( $arguments[0] ) ] = $this->clean__makesafe_value( $GLOBALS[ $_name_of_superglobal ][ $arguments[0] ], array(), true );
}
elseif ( !empty( $arguments[0] ) and !array_key_exists( $arguments[0], $GLOBALS[ $_name_of_superglobal ] ) )
{
return null;
}
else
{
if ( $this->_is_cleanup_done_for[ $name ] === true )
{
return $this->$name;
}
$this->_is_cleanup_done_for[ $name ] = true;
return $this->$name = $this->clean__makesafe_recursively( $GLOBALS[ $_name_of_superglobal ], $_max_iteration_level_for_cleanup );
}
}
?>
このコードは次のように機能します。特定のスーパーグローバル値を要求すると、オンデマンドでクリーンバージョンが返されます。
<?php
$input = new Input();
$server_name = $input->server("SERVER_NAME");
?>
簡単ですよね?さて、XAMPPでPHPを更新した後、それは機能しません[編集:警告メッセージで機能します]-エラーは次のとおりです。
PHP Warning: Illegal string offset 'SERVER_NAME' in S:\...\kernel\input.php on line 159
line、これはコードの行に対応します:
return $this->$name[ $this->clean__makesafe_key( $arguments[0] ) ] = $this->clean__makesafe_value( $GLOBALS[ $_name_of_superglobal ][ $arguments[0] ], array(), true );
これは愚かです:$_name_of_superglobal
= "_SERVER"があり、$arguments[0]
= "SERVER_NAME"であり、全体的な割り当てはクリーンアップされる文字列です。
そこに何が問題になるのでしょうか?私はここで完全に迷子になっています!