切换抛出注意:类User的对象无法转换为int

时间:2014-07-29 09:28:32

标签: php oop

我是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,有时是对象?

谢谢

2 个答案:

答案 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
}