グローバル変数(Cのような)
静的に型付けされた言語でプログラミングしている場合は、エラーメッセージにグローバル変数を使用する可能性があります(グローバル名前空間を汚染します)。
global $login_error_message;
function login($user, $password)
{
if(success)
return true;
if(failure)
{
global $login_error_message;
$login_error_message = 'Error message';
return false;
}
}
if(login($user, $password))
redirect
else
{
global $error_message
echo $error_message;
}
メンバー変数(C ++のような)
これは論理的にはグローバル変数と同じですが、汚染の問題はありません。
class LoginClass
{
private $error_message;
function login($user, $password)
{
if(success)
return true;
if(failure)
{
$this->error_message = "Error message";
return false;
}
}
function get_error_message()
{
return $this->error_message;
}
}
$loginInstance = new LoginClass();
if($loginInstance->login($user, $password))
redirect
else
echo $loginInstance->get_error_message();
参照による受け渡し(C / ++のような)
参照によって渡される追加のパラメーターを使用して、エラーコードを返します(これにより、関数呼び出しがさらに複雑になります)。
function login($user, $password, &$error_msg)
{
if(success)
return true;
if(fail)
{
$error_msg = 'Error message';
return false;
}
}
$error_message
if(login($user, $password, $error_message))
redirect
else
echo $error_message;
ミックスリターンタイプ
しかし、これはphpであるため(静的に型付けされていないため)、次のことができます。
成功した場合はtrueを返し(特別な出力は必要ないと思います)、そうでない場合はエラーメッセージを返します。この関数を使用すると、次のようになります。
function login($user, $passord)
{
if(success)
return true;
if(failure)
return "Error message";
}
$login_result = login($user, $password);
if($login_result === true)//note the ===, as == would be true on non empty strings too
success
else
echo $login_result;
連想配列を返す
もちろん、両方の値を含むことができる配列を返すこともできます。
function login($user, $password)
{
if(success)
return array("success" => true, "error_msg" => "");
if(failure);
return array("success" => false, "error_msg" => "Error message");
}
$login_result = login($user, $password);
if($login_result['success'])
redirect
else
echo $login_result['error_message'];
クラスインスタンスを返す(C / ++のような)
同様に、次のような構造を使用できます。
class LoginReturn
{
public $success;
public $error_message;
LoginReturn($success, $error_mesage)
{
$this->success = $success;
$this->error_message = $error_message;
}
};
function login$user, $password)
{
if(success)
return new LoginReturn(true, "");
if(failure)
return new LoginReturn(false, "Error message");
}
$login_result = login($user, $password);
if($login_result->success)
redirect
else
echo $login_result->error_message;
結論
これらの例を考えると、それらの長所と短所を見ることができると思います。個人的には、Member変数バリアントを使用します。これは、クラスに配置するだけで同じエラーメッセージインフラストラクチャを使用する関数を増やすためのスペースを提供するためです。