web-dev-qa-db-ja.com

関数に外部変数へのアクセスを許可する

私は外に配列を持っています:

$myArr = array();

関数に値を追加できるように、関数の外側の配列へのアクセスを許可したい

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

変数に適切なスコープを関数に与えるにはどうすればよいですか?

66
brett

デフォルトでは、関数内にいるときは、外部変数にアクセスできません。


関数が外部変数にアクセスできるようにするには、関数内でglobalとして宣言する必要があります。

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

詳細については、 Variable scope を参照してください。

しかし、グローバル変数を使用するのは良い習慣ではないことに注意してください:これにより、関数はもはや独立しなくなります。


より良いアイデアは、関数に結果を返すようにすることです。

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マニュアルの Functions セクションを読んでください。 、特に、次のサブセクション:

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

更新:矢印関数がサポートされるようになりましたが、より多くのユーザーが回答を作成するために使用します

20
Maxwell s.c
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);

それはあなたがグローバルに依存していないようになります。

10
Tyler Carter
$myArr = array();

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

    return $myArr;
}

$myArr = someFunction($myArr);
8
Amy B

目標を達成するための、おそらくそれほど良くない方法は、グローバル変数を使用することです。

関数の先頭にglobal $myArr;を追加することでそれを達成できます。ただし、ほとんどの場合、グローバル変数の使用は悪い考えであり、おそらく回避可能であることに注意してください。

より良い方法は、関数への引数として配列を渡すことです:

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

$myArr = someFunction($myArr);
2
lamas

2つの回答

1。質問に対する回答。

2。単純な変更はより良い方法に等しい!

回答1-クラス内の__construct()にVars配列を渡します。代わりに、構造を空のままにして関数に配列を渡すこともできます。

<?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>";

?>

Answer 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>";

?>

どちらのオプションも同じ情報を出力し、関数が配列およびサブ配列から情報をコード内の任意の場所にプッシュして取得できるようにします(データが最初にプッシュされた場合)。 2番目のオプションでは、データの使用方法と保護方法をより詳細に制御できます。ニーズに合わせて変更するだけで使用できますが、コントローラーの拡張に使用された場合、コントローラーが使用しているクラス間で値を共有できます。どちらの方法でも、グローバルを使用する必要はありません。

出力:

カスタムコンテンツの結果の配列

モード-カウント:5

a

b

c

フー

foo

JSカスタム-カウント:9

1

2Bまたは2Bではない

3

42

5

自転車

グラス

0
Vector-Meister