2014-09-24 4 views
2

Я пытаюсь построить функцию __construct для моего класса. Эта функция должна получить все значения $ _REQUEST и хранить их в массиве, чтобы их можно было вызывать позже по id. Проблема в том, что она не хранит мои переменные, и я не знаю почему.Функция __construct не работает должным образом

Видя, что это моя первая «серьезная» попытка построить, это, скорее всего, моя глупость. Но я хотел бы знать, что это.

Class Regex { 

private static $requests = array(); 

    function __construct() { 
     foreach($_REQUEST as $key => $value) { 
      self::$requests[$key] = array(
       'value' => $value, 
       'status' => false, 
       'errorList' => array() 
      ); 
     } 
    } 



    public static function preg($key, $rules) { 
     var_dump(self::$requests); // for test purpose 
    } 
} 

Результат: array (size=0) empty.

+1

ли вы на самом деле инициализация конструктора? – andyroo

+0

Вам нужно будет вызвать новый Regex(), чтобы вызвать вызванный конструктор – 2014-09-24 12:43:02

+1

Почему это статический, если вы просто вручную сделаете этот класс инициализированным классом? –

ответ

3

конструктор вашего класса Regex призван создать новые регулярки объекта как так:

$regex = new Regex; 

, но вы никогда не создаете объект Regex, поэтому конструктор никогда не вызывается, в результате получается пустой массив $ запросов.

2

Работает со статической функцией. Я думаю, вы не называете метод построения. Функция __construct вызывается, если вы создаете новый экземпляр.

$regex = new Regex; 

Если вызвать статический класс, например Regex::preg застройщик не называется.

+0

Привет, каменистый, ты прав. И чтобы сохранить класс static, я запускаю класс в том же файле. Таким образом, я могу продолжать называть его статическим, не бросая туда лишнюю строку :) – Matt

4

Вы даже называете конструктор? Конструктор вызывается только при вызове либо явно, либо через ключевое слово new).

PHP не имеет ничего похожего на статические конструкторы, такие как Java.

Вы должны убедиться, что массив заполняются при первом обращении к preg() методе:

public static function preg($key, $rules) { 
    if (empty(self::$requests)) { 
     foreach($_REQUEST as $key => $value) { 
      self::$requests[$key] = array(
       'value' => $value, 
       'status' => false, 
       'errorList' => array() 
      ); 
     } 
    } 
    var_dump(self::$requests); // for test purpose 
} 
+0

hmm ... Я думаю, вы имеете в виду 'if (empty())' .. иначе, так как 'self :: $ request' инициализируется как пустой массив, этот 'if (! empty())' никогда не вернет true; поэтому он никогда не будет заполнен –

+1

@ FélixGagnon-Grenier Первоначально был '! self :: $ requests' и забыл стирать'! 'при добавлении' empty() '. Спасибо :-) – bwoebi

-1

Расширение на то, что bwoebi ответил, вы все равно можете получить желаемые результаты, просто добавив вызов статической функции пропитанного связующий из самого конструктора, как вы можете увидеть ниже:

Тем не менее, это просто добавить больше раздуваться без какой-либо реальной выгоды.

Хотя это может пригодиться в некоторых случаях, и я добавил его только в этом ответе, чтобы показать, что ваша текущая структура может работать с простым добавлением двух простых строк, я бы рекомендовал обратиться с ответом @ bwoebi но имейте в виду, что, хотя контроллер сам по себе не статичен, он никоим образом не препятствует тому, чтобы он связывался со статическими методами.

PHP:

class Regex { 

    private static $requests = array(); 

    function __construct(){ 
     if (empty(self::$requests)) { 
      foreach($_REQUEST as $key => $value) { 
       self::$requests[$key] = array(
        'value' => $value, 
        'status' => false, 
        'errorList' => array() 
       ); 
      } 
     } 
     self::preg(); 
    } 

    public static function preg(){ 
     var_dump(self::$requests); // for test purpose 
    } 
} 

$var = new Regex(); 
+0

Зачем это пост? –

+0

Потому что этот сайт НЕ ТОЛЬКО в предоставлении четкого ответа, а также об обучении тех, кто задает эти ответы о том, как это работает. Хотя это не очень хорошая реализация по сравнению с оригиналом, это дает некоторое представление о том, как работает контроллер. Я думаю, что я был относительно уверен в том, что это решение будет работать, что в этом случае это не лучший вариант. Однако он все равно должен знать об этом, поскольку он может пригодиться в будущем. –

+0

, пожалуйста, сделайте это ясно в своем ответе тогда :) вы просто говорите, что добавляете что-то к существующему ответу, сильно копируете вставку содержимого и даже не говорите, что это не лучший вариант, не говоря уже об объяснении, почему это не самый лучший вариант. –

Смежные вопросы