2013-06-18 4 views
1

Мне нужно объявить кучу переменных в функции на основе данных, которые зацикливаются с использованием foreach с оператором switch с другим foreach. Я думаю, что я не понимаю рамки переменных, которые я использую, любая помощь будет отличной.PHP задает переменную в функции внутри переключателя внутри foreach

class Users { 

    public function createUserData(){ 
     $user = $this->getUserData(); //not shown function 
     $this->createFullDataSet($user); 
    } 

    private function createFullDataSet($user){ 
     foreach($user['meta'][0] as $key => $value) { 
     //variables required later 
     $entity_def_id = 0; 
     $entity_id = 0; 
     $data_def_id = 0; 
     $user_id = 0; 
     //thats plenty, you get the idea 

     switch($key){ 
      case "id": 
       //set $user_id to use later 
       $user_id = $value; // <<-- DOESN'T WORK, only works within the case 
       break; 
      case "email": 
      case "username": 
      case //lots of other cases... 
       break; 
      case "location": 
      case "hometown": 
      case "something": 
       //for the last three, the data structure is the same, good test case 
       //foreach starts when certain conditions met, irrelevant for question 
       foreach($value as $data_key => $data_value){ 
        $data_type = 'string'; 
        if(is_numeric($data_value) 
         $data_type = 'integer'; 

        $data_def_id = $this->createDataDef(some $vars); //returns an ID using $pdo->lastInsertId(); (works as has echo'd correctly, at least within this case) 

        $this->createSomethingElse //with variables within this foreach, works 
       } 
       break; 
      } //end of switch 
      $this->createRelation($data_def_id); // <<-- DOESN'T WORK!! Empty variable 
     } 
    } 

    private function createRelation($data_def_id){ 
     // something awesome happens! 
    } 
} 

Как видно из приведенного выше кода, я хочу использовать переменную вне заявление переключателя, хотя он должен быть объявлен в foreach ->switch ->foreach из-за существующей структуры данных (эти данные структура - это боль, и поэтому это нужно сделать, прежде чем кто-либо спросит: «Нельзя« просто изменить, чтобы облегчить »).

Теперь я читал на вариабельных областях применения Еогеаспа и переключите заявления (here, here, here и here и пытался найти более), однако ни мудрее, почему $data_def_id, на старте функция установлена ​​в 0, не получает сброс до любого значения, входящего во внутреннее значение foreach. Я пытаюсь избежать использования переменных global, поскольку некоторые из этих функций будут использоваться в продукте.

мне нужно, чтобы иметь возможность использовать переменные в private function, на протяжении всей частной функции (в том числе foreach, switch и т.д.). Что я делаю неправильно и как это исправить?

ответ

1

Хорошо нашел ответ.

class Users { 

    public function createUserData(){ 
     $user = $this->getUserData(); //not shown function 
     $this->createFullDataSet($user); 
    } 

    private function createFullDataSet($user){//variables required later 
     static $entity_def_id = 0; //static within function instead of non-static within foreach 
     static $entity_id = 0; 
     static $data_def_id = 0; 
     static $user_id = 0; 
     //thats plenty, you get the idea 
     foreach($user['meta'][0] as $key => $value) { 
      //remainder of that method with switch(foreach()) 
     } 
    } 

    private function createRelation($data_def_id){ 
     // something awesome happens! 
    } 
} 

Объявив переменные, как static внутри функции, в целом функции, включая методы внутри может использовать переменные. Взял меня достаточно долго: с.

+0

Вы правы. Имеет смысл объявлять функциональные переменные внутри функции, а не весь класс. Отличная работа. – ferdynator

0

Как насчет вас определить их как class properties?

class User { 

    private $data_def_id; 

    private function createFullDataSet($user){ 
     //.... 
     $this->data_def_id = $this->createDataDef(some $vars); 

    } 
} 
+0

Мог работать, но мне кажется довольно грязным. Это позволило бы мне создать множество переменных. Данные невероятно динамичны, изменяются «на лету», становится больно гарантировать, что каждый раз, когда он был сброшен до «0» или «null», перед запуском функции, требующей этих переменных. ('0' или' null', чтобы проверить их с помощью 'empty()' или 'isset()') – Nukeface

+0

, вы можете сделать это после каждого раунда цикла 'for'. Хотя это может быть грязно, он должен работать: P – ferdynator

+0

Правда, сработает. Но если/когда сопутствующий кодер приходит, все ад сломается, потеряет;) Будет ли это иметь в виду, хотя и более подходящее для решения типа курорта, с гигантским '// TO DO: сделать что-то элегантное из этого';) – Nukeface

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