我很擅长将PHP与类一起使用,并且想知道是否有更好的方法来处理我正在做的事情。基本上我正在寻找处理用户错误的最佳方法(例如“使用该用户名”等)。
我在做什么..
在init.php中
global $errors;
$errors = array();
require ...
在classname.php中
class Test {
public function myFunction($username) {
if ... {
//Do Something
global $errors;
$this->errors = $errors[] = "Username already in use!";
}
else ... {
global $errors;
$this->errors = $errors[] = "Username already in use!";
}
}
public function .... {}
}
基本上有一种方法可以使用全局数组而不必每次都重写全局$错误吗?不得不重复它只是感觉不高效,在我的情况下通常意味着有更好的方法。 有什么想法吗?
答案 0 :(得分:2)
我建议您注入$errors
而不是全球化。这样你就不必追踪它被设置/调用的位置/ etc
class Test {
public function __construct(Array $errors) {
$this->errors = $errors;
}
}
$test = new Test($errors);
答案 1 :(得分:2)
基本上,只要你必须声明一个变量global
,就可能有更好的方法来处理你正在做的事情,这将使你编写更清晰,更易于维护的代码。
我坚持使用以下两种方法来处理你遇到的问题。
class Foo {
// example 1: exceptions
public function newUser1($username) {
if( $this->userExists($username) ) {
throw new Exception("User already exists: $username");
}
}
// example 2: pass-by-reference
public function newUser2($username, &$errors) {
if( $this->userExists($username) ) {
$errors[] = "User already exists: $username";
return
}
}
}
$inst = new Foo();
$errors = array();
// example 1: exception handling
try {
$foo->newUser1('Sammitch');
} catch ( Exception $e ) {
$errors[] = $e->getMessage();
}
//example 2: pass-by-reference
$foo->newUser2('Sammitch', $errors);
if( count($errors) > 1 ) {
// oh noes!
}
Exceptions的一个限制是当你的throw执行停止并且异常进入catch
块时,或者如果没有catch块,异常会冒泡,直到它成为致命的PHP错误。