PHP全局类中的变量

时间:2014-05-08 23:21:47

标签: php class

我很擅长将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 .... {}
}

基本上有一种方法可以使用全局数组而不必每次都重写全局$错误吗?不得不重复它只是感觉不高效,在我的情况下通常意味着有更好的方法。 有什么想法吗?

2 个答案:

答案 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错误。