Предоставление моей функции доступа к внешней переменной
у меня есть массив снаружи:
$myArr = array();
Я хотел бы дать моей функции доступ к массиву вне его, чтобы он мог добавлять к нему значения
function someFuntion(){
$myVal = //some processing here to determine value of $myVal
$myArr[] = $myVal;
}
Как я могу дать функции правильную область видимости переменной?
6 ответов:
по умолчанию, когда вы находитесь внутри функции, у вас нет доступа к внешним переменным.
Если вы хотите, чтобы ваша функция имела доступ к внешней переменной, вы должны объявить ее какglobal
внутри функции :function someFuntion(){ global $myArr; $myVal = //some processing here to determine value of $myVal $myArr[] = $myVal; }
для получения дополнительной информации см. переменная.
но обратите внимание, что использование глобальных переменных не является хорошей практикой : при этом ваша функция не зависит больше.
Лучшей идеей было бы сделать вашу функцию возвращает результат:function someFuntion(){ $myArr = array(); // At first, you have an empty array $myVal = //some processing here to determine value of $myVal $myArr[] = $myVal; // Put that $myVal into the array return $myArr; }
и вызовите функцию следующим образом:
$result = someFunction();
Ваша функция также может принимать параметры, и даже работа над параметром, переданным по ссылке:function someFuntion(array & $myArr){ $myVal = //some processing here to determine value of $myVal $myArr[] = $myVal; // Put that $myVal into the array }
затем вызовите функцию следующим образом:
$myArr = array( ... ); someFunction($myArr); // The function will receive $myArr, and modify it
С этого :
- ваша функция получила внешний массив в качестве параметра
- и может изменить его, так как он перешел по ссылке.
- и это лучше, чем использовать глобальную переменную : ваша функция является единицей, независимой от любого внешнего кода.
Для получения дополнительной информации об этом, вы должны прочитать функции раздел руководства PHP, и, в частности, следующие подразделы:
$myArr = array(); function someFuntion(array $myArr) { $myVal = //some processing here to determine value of $myVal $myArr[] = $myVal; return $myArr; } $myArr = someFunction($myArr);
Global $myArr; $myArr = array(); function someFuntion(){ global $myArr; $myVal = //some processing here to determine value of $myVal $myArr[] = $myVal; }
будьте предупреждены, как правило, люди держатся подальше от глобалов, поскольку у него есть некоторые недостатки.
вы могли бы попробовать это
function someFuntion($myArr){ $myVal = //some processing here to determine value of $myVal $myArr[] = $myVal; return $myArr; } $myArr = someFunction($myArr);
Это сделало бы так, что вы не полагаетесь на глобалы.
один и, вероятно, не очень хороший способ достижения вашей цели будет использовать глобальные переменные.
вы можете достичь этого, добавив
global $myArr;
к началу вашей функции. Однако обратите внимание, что использование глобальных переменных в большинстве случаев является плохой идеей и, вероятно, ее можно избежать.гораздо лучшим способом было бы передать Ваш массив в качестве аргумента вашей функции:
function someFuntion($arr){ $myVal = //some processing here to determine value of $myVal $arr[] = $myVal; return $arr; } $myArr = someFunction($myArr);
Два Ответа
1. ответ на заданный вопрос.
2. простое изменение равно лучше!
ответ 1 - передайте массив Vars в _ _ construct () в классе, вы также можете оставить конструкцию пустой и передать массивы через ваши функции вместо этого.
<?php // Create an Array with all needed Sub Arrays Example: // Example Sub Array 1 $content_arrays["modals"]= array(); // Example Sub Array 2 $content_arrays["js_custom"] = array(); // Create a Class class Array_Pushing_Example_1 { // Public to access outside of class public $content_arrays; // Needed in the class only private $push_value_1; private $push_value_2; private $push_value_3; private $push_value_4; private $values; private $external_values; // Primary Contents Array as Parameter in __construct public function __construct($content_arrays){ // Declare it $this->content_arrays = $content_arrays; } // Push Values from in the Array using Public Function public function array_push_1(){ // Values $this->push_values_1 = array(1,"2B or not 2B",3,"42",5); $this->push_values_2 = array("a","b","c"); // Loop Values and Push Values to Sub Array foreach($this->push_values_1 as $this->values){ $this->content_arrays["js_custom"][] = $this->values; } // Loop Values and Push Values to Sub Array foreach($this->push_values_2 as $this->values){ $this->content_arrays["modals"][] = $this->values; } // Return Primary Array with New Values return $this->content_arrays; } // GET Push Values External to the Class with Public Function public function array_push_2($external_values){ $this->push_values_3 = $external_values["values_1"]; $this->push_values_4 = $external_values["values_2"]; // Loop Values and Push Values to Sub Array foreach($this->push_values_3 as $this->values){ $this->content_arrays["js_custom"][] = $this->values; } // Loop Values and Push Values to Sub Array foreach($this->push_values_4 as $this->values){ $this->content_arrays["modals"][] = $this->values; } // Return Primary Array with New Values return $this->content_arrays; } } // Start the Class with the Contents Array as a Parameter $content_arrays = new Array_Pushing_Example_1($content_arrays); // Push Internal Values to the Arrays $content_arrays->content_arrays = $content_arrays->array_push_1(); // Push External Values to the Arrays $external_values = array(); $external_values["values_1"] = array("car","house","bike","glass"); $external_values["values_2"] = array("FOO","foo"); $content_arrays->content_arrays = $content_arrays->array_push_2($external_values); // The Output echo "Array Custom Content Results 1"; echo "<br>"; echo "<br>"; echo "Modals - Count: ".count($content_arrays->content_arrays["modals"]); echo "<br>"; echo "-------------------"; echo "<br>"; // Get Modals Array Results foreach($content_arrays->content_arrays["modals"] as $modals){ echo $modals; echo "<br>"; } echo "<br>"; echo "JS Custom - Count: ".count($content_arrays->content_arrays["js_custom"]); echo "<br>"; echo "-------------------"; echo "<br>"; // Get JS Custom Array Results foreach($content_arrays->content_arrays["js_custom"] as $js_custom){ echo $js_custom; echo "<br>"; } echo "<br>"; ?>
ответ 2 - простое изменение, однако, поставило бы его в ряд с современными стандартами. Просто объявите свои массивы в классе.
<?php // Create a Class class Array_Pushing_Example_2 { // Public to access outside of class public $content_arrays; // Needed in the class only private $push_value_1; private $push_value_2; private $push_value_3; private $push_value_4; private $values; private $external_values; // Declare Contents Array and Sub Arrays in __construct public function __construct(){ // Declare them $this->content_arrays["modals"] = array(); $this->content_arrays["js_custom"] = array(); } // Push Values from in the Array using Public Function public function array_push_1(){ // Values $this->push_values_1 = array(1,"2B or not 2B",3,"42",5); $this->push_values_2 = array("a","b","c"); // Loop Values and Push Values to Sub Array foreach($this->push_values_1 as $this->values){ $this->content_arrays["js_custom"][] = $this->values; } // Loop Values and Push Values to Sub Array foreach($this->push_values_2 as $this->values){ $this->content_arrays["modals"][] = $this->values; } // Return Primary Array with New Values return $this->content_arrays; } // GET Push Values External to the Class with Public Function public function array_push_2($external_values){ $this->push_values_3 = $external_values["values_1"]; $this->push_values_4 = $external_values["values_2"]; // Loop Values and Push Values to Sub Array foreach($this->push_values_3 as $this->values){ $this->content_arrays["js_custom"][] = $this->values; } // Loop Values and Push Values to Sub Array foreach($this->push_values_4 as $this->values){ $this->content_arrays["modals"][] = $this->values; } // Return Primary Array with New Values return $this->content_arrays; } } // Start the Class without the Contents Array as a Parameter $content_arrays = new Array_Pushing_Example_2(); // Push Internal Values to the Arrays $content_arrays->content_arrays = $content_arrays->array_push_1(); // Push External Values to the Arrays $external_values = array(); $external_values["values_1"] = array("car","house","bike","glass"); $external_values["values_2"] = array("FOO","foo"); $content_arrays->content_arrays = $content_arrays->array_push_2($external_values); // The Output echo "Array Custom Content Results 1"; echo "<br>"; echo "<br>"; echo "Modals - Count: ".count($content_arrays->content_arrays["modals"]); echo "<br>"; echo "-------------------"; echo "<br>"; // Get Modals Array Results foreach($content_arrays->content_arrays["modals"] as $modals){ echo $modals; echo "<br>"; } echo "<br>"; echo "JS Custom - Count: ".count($content_arrays->content_arrays["js_custom"]); echo "<br>"; echo "-------------------"; echo "<br>"; // Get JS Custom Array Results foreach($content_arrays->content_arrays["js_custom"] as $js_custom){ echo $js_custom; echo "<br>"; } echo "<br>"; ?>
оба параметра выводят одну и ту же информацию и позволяют функции передавать и извлекать информацию из массива и под массивов в любое место кода(учитывая, что данные были переданы первыми). Второй вариант дает больше контроля над тем, как данные используются и защищаются. Они могут быть использованы как просто изменить для ваших нужд, но если они были использованы для расширения контроллера они могли бы поделиться своими значениями среди любого из классов контроллер с помощью. Ни один из методов не требует использования глобального(ых).
выход:
Массив Пользовательских Результатов Контента
Модалы-Количество: 5
a
b
c
FOO
foo
JS Custom-Count: 9
1
2B или нет 2B
3
42
5
автомобиль
дома
велосипед
стеклянный