2016-09-11 10 views
-1

У меня возникли проблемы с получением глобального массива в моем расширенном классе. Массив заполняется параметрами, которые передаются с использованием URL-адреса.PHP Почему мой массив globals пуст в моем расширенном классе

Я получаю свой url, а затем взорву его. Затем я устанавливаю первые два параметра классу и методу. Затем повторно базы моих ключей массива так начинаются параметры в 0.

Например:

class App 
{ 
    protected $controller = ''; 
    protected $method = ''; 
    protected $param = []; 

    public function init() 
    { 
     if (isset($_GET['url'])) { 
      $url = explode('/', filter_var(trim($_GET['url'], '/'), FILTER_SANITIZE_URL)); 
     } 
     else 
     { 
      header('Location: /home'); 
     } 

     if (file_exists(APP . '/controllers/' . $url[0] . '.php')) 
     { 
      $this->controller = $url[0]; 
      unset($url[0]); 
     } 
     else 
     { 
      if (DEVELOPMENT == true) { 
       var_dump($url); 
      } 
      else 
      { 
       header('Location: /home'); 
      } 
     } 

     require_once 'controllers/' . $this->controller . '.php'; 

     $className = ucfirst($this->controller); 
     $class = new $className; 

     if (isset($url[1])) 
     { 
      if (method_exists($className, $url[1])) 
      { 
       $this->method = $url[1]; 
       unset($url[1]); 
       $methodName = $this->method; 
       $class->$methodName(); 
      } 
     } 

     $GLOBALS['param'] = array_values($url); 
    } 

    public function view($view) 
    { 
     require_once VIEW . '/header.htm'; 
     require_once VIEW . '/' . $view . '.htm'; 
     require_once VIEW . '/footer.htm'; 
    } 
} 

Так что, если мой URL является сайт/класс/метод/Foo/бар, и я свалка $ GLOBALS [ «параметров» ] Я получаю

array (size=2) 
0 => string 'foo' (length=3) 
1 => string 'bar' (length=3) 

Что хорошего и чего я хочу.

Однако, если я сделаю такую ​​же свалку в своем расширенном классе.

class User extends App 
{ 
    public function __construct() 
    { 
     var_dump($GLOBALS['param']);  
    } 
} 

Мой массив пуст. На самом деле я пытаюсь получить параметры с URL-адреса в любом классе контроллера и использовать их. Как я могу это сделать?

+0

Вам действительно нужно использовать [инъекцию зависимости] (HTTP: //stackoverflow.com/documentation/php/779/dependency-injection) вместо глобального – Machavity

+0

Я знал это! Я имею в виду, что я знал, что делаю это неправильно, используя глобальные переменные. Тем не менее, я все еще участвую в учебе и инъекции зависимостей, все еще запутываю меня. Если не так много спросить, не возражаете ли вы опубликовать пример, который имеет отношение к моей ситуации? Извините заранее, я очень медленный ученик. – badsyntax

+0

Где вы получаете '$ url'? –

ответ

0

Я был в отъезде. Я исправил мою проблему путем разбора Params методы с call_user_func_array как так

class App 
{ 
    protected $controller = 'home'; 
    protected $method = 'index'; 
    protected $params = []; 

    public function init() 
    { 
     $url = $this->parseUrl(); 
     if (file_exists(APP . '/controllers/' . $url[0] . '.php')) 
     { 
      $this->controller = $url[0]; 
      unset($url[0]); 
     } 

     require_once APP . '/controllers/' . $this->controller . '.php'; 

     $this->controller = new $this->controller; 

     if (isset($url[1])) 
     { 
      if (method_exists($this->controller, $url[1])) 
      { 
       $this->method = $url[1]; 
       unset($url[1]); 
      } 
     } 

     $this->params = $url ? array_values($url) : []; 

     // Parse params to method 
     call_user_func_array([$this->controller, $this->method], $this->params); 
    } 

    public function parseUrl() 
    { 
     if (isset($_GET['url'])) 
     { 
      return $url = explode('/', filter_var(trim($_GET['url'], '/'), FILTER_SANITIZE_URL)); 
     } 
    } 

    public function view($view) 
    { 
     require_once VIEW . '/header.htm'; 
     require_once VIEW . '/' . $view . '.htm'; 
     require_once VIEW . '/footer.htm'; 
    } 
} 

Тогда я могу получить Params в моем расширенном классе

class User extends App 
{ 

    public function index($var = '', $otherVar = '') 
    { 
     echo $var. $otherVar; 
    } 

    public function register() 
    { 
     $this->view('user-register'); 
    } 

    public function login() 
    { 
     $this->view('user-login'); 
    } 
}