我是OOP的新手并且正在尝试创建一个切换系统,其中变量有时返回一个对象,有时候是一个常量(链接到一个int,因此它具有更好的可读性)。
以下是一些代码
user.class.php
class User implements IUser {
public static function initWithRegistration($mail, $username, $password) {
if(!filter_var($mail, FILTER_VALIDATE_EMAIL)) return self::ERROR_REGISTER_INVALIDMAIL;
// Loop through validation
...
$instance = new self;
// Set some vars to $instance
...
return $instance;
}
}
user.interface.php
interface IUser {
...
// Register errors
const ERROR_REGISTER_INVALIDMAIL = 7;
// More validation constants && interface here
...
}
register.php
switch($user = User::initWithRegistration($mail, $username, $password)) {
// Constant case's here
...
case User::ERROR_REGISTER_INVALIDMAIL:
$template->setError("Invalid mail.");
break;
default:
$template->setError("Invalid error.");
break;
case true:
// Do login here
break;
}
它只是不起作用,它甚至会抛出像Notice: Object of class User could not be converted to int
这样的错误。
我知道当initWithRegistration()返回一个常量时,switch会将其视为true。但我不知道其他任何处理错误的方法。
我已经尝试让initWithRegistration()在未通过验证时返回false。 我甚至尝试在没有开关和常量的情况下创建它(使用if语句并让initWithRegistration()返回字符串)但我认为使用开关和常量可以提供更好的可读性。
如何使用具有常量的开关,其中变量有时是int,有时是对象?
谢谢
答案 0 :(得分:1)
您的问题是 - 当您收到User
的实例时,系统会尝试将类与int进行比较,当然,您的类型转换会失败。
我建议您做的是使用例外情况重新编写代码,例如:
class UserValidationException extends Exception {}
class User implements IUser {
public static function initWithRegistration($mail, $username, $password) {
if (!filter_var($mail, FILTER_VALIDATE_EMAIL)) {
throw new UserValidationException();
};
// Loop through validation
...
$instance = new self;
// Set some vars to $instance
...
return $instance;
}
}
并在register.php
try {
User::initWithRegistration($mail, $username, $password);
} catch (UserValidationException $e) {
$template->setError("Invalid mail");
} catch (Exception $e) {
$template->setError("Generic error");
}
通过这种方式,您可以更好地控制错误报告。此外,从任何地方返回不一致的值通常是个坏主意,因为它非常容易出错。
答案 1 :(得分:0)
如果您想知道User::initWithRegistration(...)
是否正在返回User的实例,在这种情况下您可以:
$user = User::initWithRegistration($mail, $username, $password);
switch(gettype($user)){
case 'integer':
// returned an integer, User not created
break;
case 'object':
// returned an instance of User
}
或者,只是为了检查它是否返回了User的实例,您可以简单地:
$user = User::initWithRegistration($mail, $username, $password);
if($user instanceof User){
// $user is a User object
}