Cấp cho hàm của tôi quyền truy cập vào biến bên ngoài


77

Tôi có một mảng bên ngoài:

$myArr = array();

Tôi muốn cấp cho hàm của mình quyền truy cập vào mảng bên ngoài nó để nó có thể thêm các giá trị vào đó

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

Làm cách nào để cung cấp cho hàm đúng phạm vi cho biến?

Câu trả lời:


127

Theo mặc định, khi bạn ở bên trong một hàm, bạn không có quyền truy cập vào các biến bên ngoài.


Nếu bạn muốn hàm của mình có quyền truy cập vào một biến bên ngoài, bạn phải khai báo nó như globalbên trong hàm:

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

Để biết thêm thông tin, hãy xem Phạm vi biến .

Nhưng lưu ý rằng việc sử dụng các biến toàn cục không phải là một phương pháp hay : với điều này, hàm của bạn không còn độc lập nữa.


Ý tưởng tốt hơn là làm cho hàm của bạn trả về kết quả :

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;
}

Và gọi hàm như sau:

$result = someFunction();


Hàm của bạn cũng có thể nhận các tham số và thậm chí hoạt động trên một tham số được truyền bởi tham chiếu :

function someFuntion(array & $myArr){
    $myVal = //some processing here to determine value of $myVal
    $myArr[] = $myVal;      // Put that $myVal into the array
}

Sau đó, gọi hàm như sau:

$myArr = array( ... );
someFunction($myArr);  // The function will receive $myArr, and modify it

Với cái này :

  • Hàm của bạn đã nhận mảng bên ngoài dưới dạng tham số
  • Và có thể sửa đổi nó, vì nó được chuyển qua tham chiếu.
  • Và thực hành tốt hơn là sử dụng một biến toàn cục: hàm của bạn là một đơn vị, độc lập với bất kỳ mã bên ngoài nào.


Để biết thêm thông tin về điều đó, bạn nên đọc phần Chức năng của sổ tay PHP và đặc biệt là các phần phụ sau:


3
@Machine: một câu hỏi khá hay ^^ (Tôi đã chỉnh sửa câu trả lời của mình một vài thời gian để bổ sung thêm thông tin; có thể nó đã bị từ chối vì không đủ đầy đủ, lúc đầu ... Nó có thể liên quan đến toàn cầu, mà mọi người không thích ...)
Pascal MARTIN

3
@Machine Mr Anti-Global @Coronatus đã quyết định rằng các câu trả lời hoàn toàn khả thi là sai. Và 1.662 đại diện của anh cho anh ngay ...
Tyler Carter

1
Tôi đã đọc phiên bản đầu tiên của bạn, nó vẫn rất tốt, đủ tốt cho một phiếu bầu +1 và chắc chắn không đáng để bỏ phiếu.
PatrikAkerstrand

globalcác tham chiếu phương thức đến biến toàn cục, không phải bên ngoài!
Eugene Mala

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

CẬP NHẬT: hiện đã có hỗ trợ cho các chức năng mũi tên, nhưng tôi sẽ để cho ai đó đã sử dụng nó nhiều hơn để tạo câu trả lời


11
Global $myArr;
$myArr = array();

function someFuntion(){
    global $myArr;

    $myVal = //some processing here to determine value of $myVal
    $myArr[] = $myVal;
}

Hãy cảnh báo trước, nói chung mọi người tránh xa quả cầu vì nó có một số nhược điểm.

Bạn có thể thử cái này

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

Điều đó sẽ giúp bạn không dựa vào Globals.


Toàn cục bên trong phạm vi chức năng là đủ, bạn có chủ ý thêm một cái vào phạm vi 'chính' không? Thực hành tốt? (không bao giờ sử dụng quả cầu ..)
svens

"Toàn cục" bên ngoài chức năng là vô dụng, trừ khi toàn bộ tệp được bao gồm từ một chức năng khác.
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
Chất lượng của câu trả lời này sẽ được cải thiện đáng kể nếu có giải thích kèm theo đoạn trích.
mickmackusa

3

Một và có lẽ không phải là cách tốt để đạt được mục tiêu của bạn là sử dụng các biến toàn cục.

Bạn có thể đạt được điều đó bằng cách thêm global $myArr;vào đầu hàm của mình. Tuy nhiên, lưu ý rằng việc sử dụng các biến toàn cục trong hầu hết các trường hợp là một ý tưởng tồi và có thể tránh được.

Cách tốt hơn nhiều sẽ là chuyển mảng của bạn làm đối số cho hàm của bạn:

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

$myArr = someFunction($myArr);

0

Hai câu trả lời

1. Trả lời cho câu hỏi được hỏi.

2. Một thay đổi đơn giản tương đương với một cách tốt hơn!

Câu trả lời 1 - Chuyển Mảng Vars đến __construct () trong một lớp, bạn cũng có thể để trống cấu trúc và chuyển Mảng thông qua các hàm của bạn.

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

?>

Câu trả lời 2 - Tuy nhiên, một thay đổi đơn giản sẽ phù hợp với các tiêu chuẩn hiện đại. Chỉ cần khai báo Mảng của bạn trong Lớp.

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

?>

Cả hai tùy chọn đều xuất ra thông tin giống nhau và cho phép một hàm đẩy và truy xuất thông tin từ Mảng và Mảng con đến bất kỳ vị trí nào trong mã (Cho rằng dữ liệu đã được đẩy trước). Tùy chọn thứ hai cho phép kiểm soát nhiều hơn cách dữ liệu được sử dụng và bảo vệ. Chúng có thể được sử dụng như là chỉ sửa đổi theo nhu cầu của bạn nhưng nếu chúng được sử dụng để mở rộng Bộ điều khiển, chúng có thể chia sẻ giá trị của chúng giữa bất kỳ Lớp nào mà Bộ điều khiển đang sử dụng. Không có phương pháp nào yêu cầu sử dụng (các) Toàn cục.

Đầu ra:

Kết quả nội dung tùy chỉnh mảng

Chế độ - Đếm: 5

a

b

c

FOO

foo

JS Custom - Số lượng: 9

1

2B hoặc không 2B

3

42

5

xe hơi

nhà ở

xe đạp

cốc thủy tinh


Có quá nhiều mã không liên quan, thật khó để xem các giải pháp bạn đề xuất ở đây.
robrecord
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.