Hướng dẫn php nested function variable scope - phạm vi biến hàm lồng nhau php

Trong PHP, bạn phải sử dụng từ khóa global để truy cập một biến từ phạm vi toàn cầu khi bên trong hàm. Tuy nhiên, làm thế nào bạn có thể truy cập một biến trong phạm vi của hàm cha?

Trong ví dụ:

function foo() {
    $content = 'foobar';

    function bar() {
        echo $content; // echos nothing
    }
}

Làm thế nào tôi có thể truy cập vào biến $content?

Đã hỏi ngày 21 tháng 1 năm 2019 lúc 0:39Jan 21, 2019 at 0:39

Hướng dẫn php nested function variable scope - phạm vi biến hàm lồng nhau php

1

Bạn có hai tùy chọn:

  1. Đưa ra $content dưới dạng tham số

    function foo() {
        $content = 'foobar';
    
        function bar($content) {
            echo $content . '1'; // 'foobar1'
        }
    
        bar();
    }
    
    foo();
    
  2. Sử dụng đóng cửa (Hướng dẫn sử dụng PHP) (PHP 5.3.0+) (PHP Manual) (PHP 5.3.0+)

    Xin lưu ý rằng khai báo chức năng hơi khác một chút so với 'cách thông thường' của việc khai báo các chức năng.

    function foo() {
        $content = 'foobar';
    
        $bar = function() use ($content) {
            echo $content . '1';
        };  // <-- As it's an assignment, end with a ';'
    
        $bar();
    }
    
    foo();  // 'foobar1'
    

Đã trả lời ngày 21 tháng 1 năm 2019 lúc 0:43Jan 21, 2019 at 0:43

Hướng dẫn php nested function variable scope - phạm vi biến hàm lồng nhau php

2

Pogregoire ## Live.fr ¶

$a 1;
include 
'b.inc';
?>

Jameslee at cs dot nmt dot edu ¶

$a 1/* global scope */ function test()

    echo 
$a/* reference to local scope variable */ 
test();
?>

17 năm trước

Jake Dot Tunaley tại Berkeleyit Dot Com ¶

3 năm trước

Phạm vi của một hàm lồng nhau là gì?

function foo() {
    $content = 'foobar';

    function bar($content) {
        echo $content . '1'; // 'foobar1'
    }

    bar();
}

foo();
3

function foo() {
    $content = 'foobar';

    function bar($content) {
        echo $content . '1'; // 'foobar1'
    }

    bar();
}

foo();
4

function foo() {
    $content = 'foobar';

    function bar($content) {
        echo $content . '1'; // 'foobar1'
    }

    bar();
}

foo();
5

Phạm vi của hàm lồng nhau nằm trong hàm bao quanh, tức là bên trong một trong các khối cấu thành của hàm đó, điều đó có nghĩa là nó vô hình bên ngoài khối đó và cả bên ngoài hàm bao quanh. Một hàm lồng nhau có thể truy cập các hàm, biến, hằng số, loại, lớp, v.v.

Phạm vi lồng nhau của các biến là gì?

Ví dụ #2 sử dụng $ globals thay vì toàn cầu

function foo() {
    $content = 'foobar';

    function bar($content) {
        echo $content . '1'; // 'foobar1'
    }

    bar();
}

foo();
3

function foo() {
    $content = 'foobar';

    function bar($content) {
        echo $content . '1'; // 'foobar1'
    }

    bar();
}

foo();
4

function foo() {
    $content = 'foobar';

    function bar($content) {
        echo $content . '1'; // 'foobar1'
    }

    bar();
}

foo();
9

Mảng $ Globals là một mảng kết hợp với tên của biến toàn cầu là khóa và nội dung của biến đó là giá trị của phần tử mảng. Lưu ý cách $ Globals tồn tại trong bất kỳ phạm vi nào, điều này là do $ Globals là một siêu thị. Đây là một ví dụ chứng minh sức mạnh của Superglobals:

Ví dụ #3 Ví dụ chứng minh Superglobals và Phạm vi

function foo() {
    $content = 'foobar';

    $bar = function() use ($content) {
        echo $content . '1';
    };  // <-- As it's an assignment, end with a ';'

    $bar();
}

foo();  // 'foobar1'
0

Ghi chú::

Sử dụng từ khóa global bên ngoài chức năng không phải là lỗi. Nó có thể được sử dụng nếu tệp được bao gồm từ bên trong một hàm.

Sử dụng các biến function foo() { $content = 'foobar'; $bar = function() use ($content) { echo $content . '1'; }; // <-- As it's an assignment, end with a ';' $bar(); } foo(); // 'foobar1' 2

Một tính năng quan trọng khác của phạm vi biến là biến tĩnh. Một biến tĩnh chỉ tồn tại trong phạm vi hàm cục bộ, nhưng nó không mất giá trị khi thực hiện chương trình rời khỏi phạm vi này. Xem xét ví dụ sau:

Ví dụ #4 Ví dụ Thể hiện nhu cầu về các biến tĩnh

function foo() {
    $content = 'foobar';

    $bar = function() use ($content) {
        echo $content . '1';
    };  // <-- As it's an assignment, end with a ';'

    $bar();
}

foo();  // 'foobar1'
3

Chức năng này khá vô dụng vì mỗi lần được gọi là đặt $ A thành

function foo() {
    $content = 'foobar';

    $bar = function() use ($content) {
        echo $content . '1';
    };  // <-- As it's an assignment, end with a ';'

    $bar();
}

foo();  // 'foobar1'
4 và in
function foo() {
    $content = 'foobar';

    $bar = function() use ($content) {
        echo $content . '1';
    };  // <-- As it's an assignment, end with a ';'

    $bar();
}

foo();  // 'foobar1'
4. $ A ++ tăng biến không phục vụ mục đích nào vì ngay khi hàm thoát ra khỏi biến $ A biến mất. Để tạo chức năng đếm hữu ích sẽ không mất dấu của số lượng hiện tại, biến $ một được khai báo tĩnh:

Ví dụ #5 Ví dụ sử dụng các biến tĩnh

function foo() {
    $content = 'foobar';

    $bar = function() use ($content) {
        echo $content . '1';
    };  // <-- As it's an assignment, end with a ';'

    $bar();
}

foo();  // 'foobar1'
6

Bây giờ, $ A chỉ được khởi tạo trong cuộc gọi đầu tiên của hàm và mỗi khi hàm

function foo() {
    $content = 'foobar';

    $bar = function() use ($content) {
        echo $content . '1';
    };  // <-- As it's an assignment, end with a ';'

    $bar();
}

foo();  // 'foobar1'
7 được gọi là nó sẽ in giá trị của $ a và tăng nó.

Các biến tĩnh cũng cung cấp một cách để đối phó với các hàm đệ quy. Một hàm đệ quy là một hàm tự gọi. Phải cẩn thận khi viết một hàm đệ quy vì có thể làm cho nó tái phát vô thời hạn. Bạn phải chắc chắn rằng bạn có một cách đủ để chấm dứt đệ quy. Hàm đơn giản sau đây được tính vào 10, sử dụng số lượng tĩnh $ để biết khi nào nên dừng:

Ví dụ #6 biến tĩnh với các hàm đệ quy

function foo() {
    $content = 'foobar';

    $bar = function() use ($content) {
        echo $content . '1';
    };  // <-- As it's an assignment, end with a ';'

    $bar();
}

foo();  // 'foobar1'
8

Các biến tĩnh có thể được gán các giá trị là kết quả của các biểu thức không đổi, nhưng các biểu thức động, chẳng hạn như các lệnh gọi hàm, sẽ gây ra lỗi phân tích cú pháp.

Ví dụ #7 Khai báo các biến tĩnh

function foo() {
    $content = 'foobar';

    $bar = function() use ($content) {
        echo $content . '1';
    };  // <-- As it's an assignment, end with a ';'

    $bar();
}

foo();  // 'foobar1'
9

Kể từ Php 8.1.0, khi một phương thức sử dụng các biến tĩnh được kế thừa (nhưng không được ghi đè), phương thức kế thừa giờ đây sẽ chia sẻ các biến tĩnh với phương thức mẹ. Điều này có nghĩa là các biến tĩnh trong các phương thức bây giờ hoạt động giống như các thuộc tính tĩnh.

Ví dụ #8 Sử dụng các biến tĩnh trong các phương thức được kế thừa

NULL
object(stdClass)#1 (0) {
}
0

Ghi chú::

Sử dụng từ khóa global bên ngoài chức năng không phải là lỗi. Nó có thể được sử dụng nếu tệp được bao gồm từ bên trong một hàm.

Sử dụng các biến function foo() { $content = 'foobar'; $bar = function() use ($content) { echo $content . '1'; }; // <-- As it's an assignment, end with a ';' $bar(); } foo(); // 'foobar1' 2

Một tính năng quan trọng khác của phạm vi biến là biến tĩnh. Một biến tĩnh chỉ tồn tại trong phạm vi hàm cục bộ, nhưng nó không mất giá trị khi thực hiện chương trình rời khỏi phạm vi này. Xem xét ví dụ sau:

NULL
object(stdClass)#1 (0) {
}
4

function foo() {
    $content = 'foobar';

    function bar($content) {
        echo $content . '1'; // 'foobar1'
    }

    bar();
}

foo();
4

NULL
object(stdClass)#1 (0) {
}
6

Ví dụ #4 Ví dụ Thể hiện nhu cầu về các biến tĩnh

NULL
object(stdClass)#1 (0) {
}

Chức năng này khá vô dụng vì mỗi lần được gọi là đặt $ A thành

function foo() {
    $content = 'foobar';

    $bar = function() use ($content) {
        echo $content . '1';
    };  // <-- As it's an assignment, end with a ';'

    $bar();
}

foo();  // 'foobar1'
4 và in
function foo() {
    $content = 'foobar';

    $bar = function() use ($content) {
        echo $content . '1';
    };  // <-- As it's an assignment, end with a ';'

    $bar();
}

foo();  // 'foobar1'
4. $ A ++ tăng biến không phục vụ mục đích nào vì ngay khi hàm thoát ra khỏi biến $ A biến mất. Để tạo chức năng đếm hữu ích sẽ không mất dấu của số lượng hiện tại, biến $ một được khai báo tĩnh:

NULL
object(stdClass)#1 (0) {
}
8

NULL
object(stdClass)#1 (0) {
}
9

Static object: NULL
Static object: NULL

Static object: NULL
Static object: object(stdClass)#3 (1) {
  ["property"]=>
  int(1)
}
0

Ví dụ #4 Ví dụ Thể hiện nhu cầu về các biến tĩnh

Static object: NULL
Static object: NULL

Static object: NULL
Static object: object(stdClass)#3 (1) {
  ["property"]=>
  int(1)
}

Chức năng này khá vô dụng vì mỗi lần được gọi là đặt $ A thành

function foo() {
    $content = 'foobar';

    $bar = function() use ($content) {
        echo $content . '1';
    };  // <-- As it's an assignment, end with a ';'

    $bar();
}

foo();  // 'foobar1'
4 và in
function foo() {
    $content = 'foobar';

    $bar = function() use ($content) {
        echo $content . '1';
    };  // <-- As it's an assignment, end with a ';'

    $bar();
}

foo();  // 'foobar1'
4. $ A ++ tăng biến không phục vụ mục đích nào vì ngay khi hàm thoát ra khỏi biến $ A biến mất. Để tạo chức năng đếm hữu ích sẽ không mất dấu của số lượng hiện tại, biến $ một được khai báo tĩnh:

Ví dụ #5 Ví dụ sử dụng các biến tĩnh

Bây giờ, $ A chỉ được khởi tạo trong cuộc gọi đầu tiên của hàm và mỗi khi hàm

function foo() {
    $content = 'foobar';

    $bar = function() use ($content) {
        echo $content . '1';
    };  // <-- As it's an assignment, end with a ';'

    $bar();
}

foo();  // 'foobar1'
7 được gọi là nó sẽ in giá trị của $ a và tăng nó.

Static object: NULL
Static object: NULL

Static object: NULL
Static object: object(stdClass)#3 (1) {
  ["property"]=>
  int(1)
}
2

Các biến tĩnh cũng cung cấp một cách để đối phó với các hàm đệ quy. Một hàm đệ quy là một hàm tự gọi. Phải cẩn thận khi viết một hàm đệ quy vì có thể làm cho nó tái phát vô thời hạn. Bạn phải chắc chắn rằng bạn có một cách đủ để chấm dứt đệ quy. Hàm đơn giản sau đây được tính vào 10, sử dụng số lượng tĩnh $ để biết khi nào nên dừng:

Ví dụ #6 biến tĩnh với các hàm đệ quy

Static object: NULL
Static object: NULL

Static object: NULL
Static object: object(stdClass)#3 (1) {
  ["property"]=>
  int(1)
}
3

Static object: NULL
Static object: NULL

Static object: NULL
Static object: object(stdClass)#3 (1) {
  ["property"]=>
  int(1)
}
4

Static object: NULL
Static object: NULL

Static object: NULL
Static object: object(stdClass)#3 (1) {
  ["property"]=>
  int(1)
}
5

Static object: NULL
Static object: NULL

Static object: NULL
Static object: object(stdClass)#3 (1) {
  ["property"]=>
  int(1)
}
6

Các biến tĩnh có thể được gán các giá trị là kết quả của các biểu thức không đổi, nhưng các biểu thức động, chẳng hạn như các lệnh gọi hàm, sẽ gây ra lỗi phân tích cú pháp.

Ví dụ #7 Khai báo các biến tĩnh

Static object: NULL
Static object: NULL

Static object: NULL
Static object: object(stdClass)#3 (1) {
  ["property"]=>
  int(1)
}
7

Static object: NULL
Static object: NULL

Static object: NULL
Static object: object(stdClass)#3 (1) {
  ["property"]=>
  int(1)
}
8

Static object: NULL
Static object: NULL

Static object: NULL
Static object: object(stdClass)#3 (1) {
  ["property"]=>
  int(1)
}
9

global0

global1

Kể từ Php 8.1.0, khi một phương thức sử dụng các biến tĩnh được kế thừa (nhưng không được ghi đè), phương thức kế thừa giờ đây sẽ chia sẻ các biến tĩnh với phương thức mẹ. Điều này có nghĩa là các biến tĩnh trong các phương thức bây giờ hoạt động giống như các thuộc tính tĩnh.

Ví dụ #8 Sử dụng các biến tĩnh trong các phương thức được kế thừa

global2

global3

global4

global5

global6

global7

global8

global9

$content0

Khai báo tĩnh được giải quyết trong thời gian biên dịch.

Ví dụ #6 biến tĩnh với các hàm đệ quy

$content1

$content2

$content3

$content0

Các biến tĩnh có thể được gán các giá trị là kết quả của các biểu thức không đổi, nhưng các biểu thức động, chẳng hạn như các lệnh gọi hàm, sẽ gây ra lỗi phân tích cú pháp.

Ví dụ #7 Khai báo các biến tĩnh

$content5

$content6

$content7

$content8

Kể từ Php 8.1.0, khi một phương thức sử dụng các biến tĩnh được kế thừa (nhưng không được ghi đè), phương thức kế thừa giờ đây sẽ chia sẻ các biến tĩnh với phương thức mẹ. Điều này có nghĩa là các biến tĩnh trong các phương thức bây giờ hoạt động giống như các thuộc tính tĩnh.

Ví dụ #8 Sử dụng các biến tĩnh trong các phương thức được kế thừa

$content9

$content0

$content1

$content2

$content3

$content4

global0

$content6

Khai báo tĩnh được giải quyết trong thời gian biên dịch.

Tài liệu tham khảo với các biến global

function foo() {
    $content = 'foobar';

    $bar = function() use ($content) {
        echo $content . '1';
    };  // <-- As it's an assignment, end with a ';'

    $bar();
}

foo();  // 'foobar1'
2

$content7

$content8

$content9

$a 1;
include 
'b.inc';
?>
0

$content0

PHP thực hiện công cụ sửa đổi tĩnh và toàn cầu cho các biến về mặt tham chiếu. Ví dụ, một biến toàn cầu thực sự được nhập trong phạm vi hàm với câu lệnh global thực sự tạo ra một tham chiếu đến biến toàn cầu. Điều này có thể dẫn đến hành vi bất ngờ mà ví dụ sau đây:

Ví dụ #8 Sử dụng các biến tĩnh trong các phương thức được kế thừa

$a 1;
include 
'b.inc';
?>
2

$a 1;
include 
'b.inc';
?>
3

$content0

Khai báo tĩnh được giải quyết trong thời gian biên dịch.

Ví dụ #7 Khai báo các biến tĩnh

$a 1;
include 
'b.inc';
?>
5

$a 1;
include 
'b.inc';
?>
6

Static object: NULL
Static object: NULL

Static object: NULL
Static object: object(stdClass)#3 (1) {
  ["property"]=>
  int(1)
}
5

$a 1;
include 
'b.inc';
?>
8

Kể từ Php 8.1.0, khi một phương thức sử dụng các biến tĩnh được kế thừa (nhưng không được ghi đè), phương thức kế thừa giờ đây sẽ chia sẻ các biến tĩnh với phương thức mẹ. Điều này có nghĩa là các biến tĩnh trong các phương thức bây giờ hoạt động giống như các thuộc tính tĩnh.

Ví dụ #7 Khai báo các biến tĩnh

$a 1;
include 
'b.inc';
?>
9

$a 1/* global scope */ function test()

    echo 
$a/* reference to local scope variable */ 
test();
?>
0

$a 1/* global scope */ function test()

    echo 
$a/* reference to local scope variable */ 
test();
?>
1

$a 1/* global scope */ function test()

    echo 
$a/* reference to local scope variable */ 
test();
?>
2

Kể từ Php 8.1.0, khi một phương thức sử dụng các biến tĩnh được kế thừa (nhưng không được ghi đè), phương thức kế thừa giờ đây sẽ chia sẻ các biến tĩnh với phương thức mẹ. Điều này có nghĩa là các biến tĩnh trong các phương thức bây giờ hoạt động giống như các thuộc tính tĩnh.

Ví dụ #8 Sử dụng các biến tĩnh trong các phương thức được kế thừa

$a 1/* global scope */ function test()

    echo 
$a/* reference to local scope variable */ 
test();
?>
3

$a 1/* global scope */ function test()

    echo 
$a/* reference to local scope variable */ 
test();
?>
4

$content0

Khai báo tĩnh được giải quyết trong thời gian biên dịch.

Tài liệu tham khảo với các biến global

function foo() {
    $content = 'foobar';

    $bar = function() use ($content) {
        echo $content . '1';
    };  // <-- As it's an assignment, end with a ';'

    $bar();
}

foo();  // 'foobar1'
2

$a 1/* global scope */ function test()

    echo 
$a/* reference to local scope variable */ 
test();
?>
6

$a 1/* global scope */ function test()

    echo 
$a/* reference to local scope variable */ 
test();
?>
7

$a 1/* global scope */ function test()

    echo 
$a/* reference to local scope variable */ 
test();
?>
8

$a 1/* global scope */ function test()

    echo 
$a/* reference to local scope variable */ 
test();
?>
9

$content0

Phạm vi của một hàm lồng nhau là gì?

Phạm vi của hàm lồng nhau nằm trong hàm bao quanh, tức là bên trong một trong các khối cấu thành của hàm đó, điều đó có nghĩa là nó vô hình bên ngoài khối đó và cả bên ngoài hàm bao quanh.Một hàm lồng nhau có thể truy cập các hàm, biến, hằng số, loại, lớp, v.v.inside the enclosing function, i.e. inside one of the constituent blocks of that function, which means that it is invisible outside that block and also outside the enclosing function. A nested function can access other local functions, variables, constants, types, classes, etc.

Phạm vi lồng nhau của các biến là gì?

Phạm vi của một biến là phạm vi của các hàm có quyền truy cập trực tiếp vào biến để đặt, sửa đổi hoặc có được giá trị của nó.Khi bạn xác định một biến cục bộ (tức là, nonglobal) trong một hàm, phạm vi của nó thường bị giới hạn trong chức năng đó.the range of functions that have direct access to the variable to set, modify, or acquire its value. When you define a local (i.e., nonglobal) variable within a function, its scope is normally restricted to that function alone.

4 phạm vi biến của PHP là gì?

PHP có ba phạm vi biến khác nhau: cục bộ.toàn cầu.tĩnh.local. global. static.

Làm thế nào tôi có thể truy cập một biến chức năng từ một hàm khác trong PHP?

Nếu biến cần thiết là kết quả của một hàm và bạn có tất cả các chức năng của mình trên một trang *i.e.chức năng.PHP*, bạn chỉ cần sử dụng 'bao gồm/path/to/function.