Надання моїй функції доступу до зовнішньої змінної


77

У мене є масив зовні:

$myArr = array();

Я хотів би надати своїй функції доступ до масиву поза ним, щоб вона могла додавати до нього значення

function someFuntion(){
    $myVal = //some processing here to determine value of $myVal
    $myArr[] = $myVal;
}

Як надати функції правильний масштаб до змінної?

Відповіді:


127

За замовчуванням, перебуваючи всередині функції, ви не маєте доступу до зовнішніх змінних.


Якщо ви хочете, щоб ваша функція мала доступ до зовнішньої змінної, вам потрібно оголосити це як 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 та, особливо, наступні підрозділи:


3
@Machine: непогане запитання ^^ (Оскільки я пару раз редагував свою відповідь, щоб додати більше інформації; можливо, вона була проти, оскільки спочатку недостатньо повна ... Це, мабуть, має щось спільне з глобальним, які люди не люблять ...)
Паскаль МАРТІН

3
@Machine Mr Anti-Global @Coronatus вирішив, що цілком життєздатні відповіді є неправильними. І його 1662 репліка робить його правильним ...
Тайлер Картер

1
Я прочитав вашу початкову версію, вона все ще була достатньо хорошою для оцінки +1, і точно не коштувала "проти".
PatrikAkerstrand

globalпосилання методу на глобальну змінну, а не зовні!
Євген Мала

26
$foo = 42;
$bar = function($x = 0) use ($foo){
    return $x + $foo;
};
var_dump($bar(10)); // int(52)

ОНОВЛЕННЯ: тепер є підтримка функцій зі стрілками, але я дозволю тому, хто більше використовував її для створення відповіді


11
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);

Це означало б, що ви не покладаєтесь на глобали.


Глобального всередині сфери функцій може бути достатньо, ви навмисно додали його до "основної" області? Гарна практика? (ніколи не використовує глобальні ..)
svens

"Глобальний" поза функцією марний, якщо весь файл не був включений з іншої функції.
andreszs

9
$myArr = array();

function someFuntion(array $myArr) {
    $myVal = //some processing here to determine value of $myVal
    $myArr[] = $myVal;

    return $myArr;
}

$myArr = someFunction($myArr);

1
Якість цієї відповіді значно покращилася б, якби було пояснення з фрагментом.
mickmackusa

3

Одним і, мабуть, не дуже хорошим способом досягнення своєї мети було б використання глобальних змінних.

Ви можете досягти цього, додавши global $myArr; на початку своєї функції. Однак зауважте, що використання глобальних змінних у більшості випадків є поганою ідеєю і, можливо, її можна уникнути.

Набагато кращим способом буде передача вашого масиву як аргументу вашої функції:

function someFuntion($arr){
    $myVal = //some processing here to determine value of $myVal
    $arr[] = $myVal;
    return $arr;
}

$myArr = someFunction($myArr);

0

Дві відповіді

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

JS Custom - Кількість: 9

1

2B чи ні 2B

3

42

5

автомобіль

будинок

велосипед

скло


Тут так багато непов’язаного коду, що важко побачити рішення, які ви пропонуєте тут.
robrecord
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.