2017-01-11 8 views
-1

Хорошо, я немного пошатнул код ... Я не уверен, что то, что я пытаюсь выполнить, возможно или нет.При использовании include внутри функции, как мне получить доступ к переменной, объявленной перед включением?

У меня есть класс, называемый пример с функцией под названием Шаблон, который имеет 1 параметр

Class Example{ 
    public function Template($root){ 
     include ROOT."/templates/{$root}.php"; 
    } 
} 

У меня есть множество продуктов, я экземпляр этого класса и запустить функцию шаблона

$products = array("garbage"); 
$test = new Example; 
$test->Template("product"); 

Здесь является примером копии /templates/product.php

print 'Test'; 
print_r($products); 

Я возвращаюсь страницу, на которой отображается «Тест», но я не могу получить доступ к массиву $products, который был определен до функции Template.

Если я иду по прямому маршруту include ROOT."/templates/product.php";, все работает.

Я не могу использовать функцию внутри функции?

+0

Это нет. Это массив (или его следует считать) Исправлено – FuckYou

+0

Не проблема, и вы не поняли вопрос, потому что, если бы я заявил, что могу получить результат с помощью прямого включения , очевидно, массив является массивом и просто помещен здесь как держатель, как если бы он уже был определен. Во всяком случае, спасибо. Я обновил это – FuckYou

+1

«Правильный» ответ: передать массив в класс через конструктор ... но глобальные $ products; в верхней части файла, в котором вы используете $ products, будет работать ... ОДНАКО это очень сильно неодобрительно, и я ненавижу себя за предложение! – Brian

ответ

3

Ну, если вы собираетесь globals то кажется, что другой ответ всегда будет использовать $products. Вот динамичный путь, чтобы вы могли пройти 'user' и $users (добавлен «s») будет доступен и т.д ...

Class Example{ 
    public function Template($root){ 
     ${$root.'s'} = $GLOBALS["{$root}s"]; 
     include ROOT."/templates/{$root}.php"; 
    } 
} 

Тем не менее, было бы лучше передавая переменную и использовать стандартное имя в пределах функция, $data в этом случае и все шаблоны будут использовать $data:

Class Example{ 
    public function Template($root, $data){ 
     include ROOT."/templates/{$root}.php"; 
    } 
} 

$products = array("garbage"); 
$test = new Example; 
$test->Template("product", $products); 

Если вам действительно нужно определенное имя, как $products по какой-либо причине, а затем рассмотреть вопрос передачи его в качестве ассоциативного массива:

Class Example{ 
    public function Template($root, $data){ 
     extract($data); 
     include ROOT."/templates/{$root}.php"; 
    } 
} 

$products = array("garbage"); 
$test = new Example; 
$test->Template("product", compact("products"); 
+0

yep, как я заявил в комментарии. Под другим ответом –

1

Ваша проблема заключается в том, что ваш переменный $ product определен в глобальной области, и вы включаете файл внутри функции, поэтому файл будет ссылаться на переменную $ product из локальной области действия функции.

попробовать это:

Class Example{ 
     public function Template($root){ 
      global $products; 
      include ROOT."/templates/{$root}.php"; 
     } 
    } 
+0

Спасибо за ваш ответ! Брайан выше заявил, что это нахмурилось, может ли кто-нибудь объяснить, почему? – FuckYou

+0

http://stackoverflow.com/questions/8715897/why-is-it-considered-bad-practice-to-use-global-reference-inside-functions – Brian

+1

Thats из-за области переменных. Каждая переменная находится в локальной области действия некоторой области. Те, которые определены в глобальном масштабе, являются глобальными переменными. Но во внутренних функциях глобальная область видимости изменяется локальной областью, и глобальные переменные не будут доступны, пока вы не объявите, что хотите использовать некоторую переменную глобальной области. –