Hướng dẫn php static variable inside method - biến tĩnh php bên trong phương thức

Tôi đã xem xét nguồn cho Drupal 7, và tôi đã tìm thấy một số điều tôi chưa từng thấy trước đây. Tôi đã thực hiện một số tìm kiếm ban đầu trong hướng dẫn sử dụng PHP, nhưng nó không giải thích những ví dụ này.

Từ khóa static làm gì cho một biến bên trong một hàm?

function module_load_all($bootstrap = FALSE) {
    static $has_run = FALSE

Khi được hỏi ngày 31 tháng 5 năm 2011 lúc 14:21May 31, 2011 at 14:21

Hướng dẫn php static variable inside method - biến tĩnh php bên trong phương thức

user151841user151841user151841

16.7K28 Huy hiệu vàng108 Huy hiệu bạc166 Huy hiệu đồng28 gold badges108 silver badges166 bronze badges

1

Nó làm cho hàm ghi nhớ giá trị của biến đã cho (

function doStuff() {
  static $cache = null;

  if ($cache === null) {
     $cache = '%heavy database stuff or something%';
  }

  // code using $cache
}
0 trong ví dụ của bạn) giữa nhiều cuộc gọi.

Bạn có thể sử dụng điều này cho các mục đích khác nhau, ví dụ:

function doStuff() {
  static $cache = null;

  if ($cache === null) {
     $cache = '%heavy database stuff or something%';
  }

  // code using $cache
}

Trong ví dụ này,

function doStuff() {
  static $cache = null;

  if ($cache === null) {
     $cache = '%heavy database stuff or something%';
  }

  // code using $cache
}
1 sẽ chỉ được thực hiện một lần. Ngay cả khi nhiều cuộc gọi đến
function doStuff() {
  static $cache = null;

  if ($cache === null) {
     $cache = '%heavy database stuff or something%';
  }

  // code using $cache
}
2 sẽ xảy ra.

RPHV

5.2643 Huy hiệu vàng30 Huy hiệu bạc46 Huy hiệu Đồng3 gold badges30 silver badges46 bronze badges

Đã trả lời ngày 31 tháng 5 năm 2011 lúc 14:22May 31, 2011 at 14:22

9

Có vẻ như không có ai đề cập đến nay, các biến tĩnh bên trong các trường hợp khác nhau của cùng một lớp vẫn là trạng thái của chúng. Vì vậy, hãy cẩn thận khi viết mã OOP.

Xem xét điều này:

class Foo
{
    public function call()
    {
        static $test = 0;

        $test++;
        echo $test . PHP_EOL; 
    }
}

$a = new Foo();
$a->call(); // 1
$a->call(); // 2
$a->call(); // 3


$b = new Foo();
$b->call(); // 4
$b->call(); // 5

Nếu bạn muốn một biến tĩnh để nhớ trạng thái của nó chỉ cho phiên bản lớp hiện tại, bạn nên gắn bó với thuộc tính lớp, như thế này:

class Bar
{
    private $test = 0;

    public function call()
    {
        $this->test++;
        echo $this->test . PHP_EOL; 
    }
}


$a = new Bar();
$a->call(); // 1
$a->call(); // 2
$a->call(); // 3


$b = new Bar();
$b->call(); // 1
$b->call(); // 2

Đã trả lời ngày 10 tháng 1 năm 2015 lúc 17:49Jan 10, 2015 at 17:49

YangyangYang

8.5008 Huy hiệu vàng32 Huy hiệu bạc55 Huy hiệu Đồng8 gold badges32 silver badges55 bronze badges

1

Đưa ra ví dụ sau:

function a($s){
    static $v = 10;
    echo $v;
    $v = $s;
}

Cuộc gọi đầu tiên của

a(20);

sẽ xuất ra

function doStuff() {
  static $cache = null;

  if ($cache === null) {
     $cache = '%heavy database stuff or something%';
  }

  // code using $cache
}
3, sau đó
function doStuff() {
  static $cache = null;

  if ($cache === null) {
     $cache = '%heavy database stuff or something%';
  }

  // code using $cache
}
4 là
function doStuff() {
  static $cache = null;

  if ($cache === null) {
     $cache = '%heavy database stuff or something%';
  }

  // code using $cache
}
5. Biến
function doStuff() {
  static $cache = null;

  if ($cache === null) {
     $cache = '%heavy database stuff or something%';
  }

  // code using $cache
}
4 không được thu thập sau khi hàm kết thúc, vì nó là một biến tĩnh (không di động). Biến sẽ nằm trong phạm vi của nó cho đến khi tập lệnh hoàn toàn kết thúc.

Do đó, cuộc gọi sau đây của

a(15);

Sau đó, sẽ xuất ra

function doStuff() {
  static $cache = null;

  if ($cache === null) {
     $cache = '%heavy database stuff or something%';
  }

  // code using $cache
}
5, sau đó đặt
function doStuff() {
  static $cache = null;

  if ($cache === null) {
     $cache = '%heavy database stuff or something%';
  }

  // code using $cache
}
4 thành
function doStuff() {
  static $cache = null;

  if ($cache === null) {
     $cache = '%heavy database stuff or something%';
  }

  // code using $cache
}
9.

Đã trả lời ngày 31 tháng 5 năm 2011 lúc 14:26May 31, 2011 at 14:26

Maurismaurismauris

42.2K15 Huy hiệu vàng96 Huy hiệu bạc131 Huy hiệu Đồng15 gold badges96 silver badges131 bronze badges

0

Tĩnh hoạt động giống như cách nó làm trong một lớp. Biến được chia sẻ trên tất cả các trường hợp của một hàm. Trong ví dụ cụ thể của bạn, một khi hàm được chạy, $ has_run được đặt thành true. Tất cả các lần chạy trong tương lai của hàm sẽ có $ has_run = true. Điều này đặc biệt hữu ích trong các chức năng đệ quy (thay thế để vượt qua số lượng).

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 http://php.net/manual/en/language.variables.scope.php

Đã trả lời ngày 31 tháng 5 năm 2011 lúc 14:26May 31, 2011 at 14:26

Maurismauristofutim

42.2K15 Huy hiệu vàng96 Huy hiệu bạc131 Huy hiệu Đồng20 gold badges83 silver badges146 bronze badges

Tĩnh hoạt động giống như cách nó làm trong một lớp. Biến được chia sẻ trên tất cả các trường hợp của một hàm. Trong ví dụ cụ thể của bạn, một khi hàm được chạy, $ has_run được đặt thành true. Tất cả các lần chạy trong tương lai của hàm sẽ có $ has_run = true. Điều này đặc biệt hữu ích trong các chức năng đệ quy (thay thế để vượt qua số lượng).

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.

<?php
class base {
     function calc() {
        static $foo = 0;
        $foo++;
        return $foo;
     }
}

class one extends base {
    function e() {
        echo "one:".$this->calc().PHP_EOL;
    }
}
class two extends base {
    function p() {
        echo "two:".$this->calc().PHP_EOL;
    }
}
$x = new one();
$y = new two();
$x_repeat = new one();

$x->e();
$y->p();
$x->e();
$x_repeat->e();
$x->e();
$x_repeat->e();
$y->p();

outputs:

Xem http://php.net/manual/en/language.variables.scope.php
two:1
one:2
one:3 <-- x_repeat
one:4
one:5 <-- x_repeat
two:2

http://ideone.com/W4W5Qv

TofutimtofutimJul 26, 2016 at 8:00

Hướng dẫn php static variable inside method - biến tĩnh php bên trong phương thức

21.8K20 Huy hiệu vàng83 Huy hiệu bạc146 Huy hiệu đồngTschallacka

Để mở rộng câu trả lời của Yang13 gold badges90 silver badges131 bronze badges

Nếu bạn mở rộng một lớp với các biến tĩnh, các lớp mở rộng riêng lẻ sẽ giữ tĩnh "riêng" được tham chiếu được chia sẻ giữa các trường hợp.

<?php

class Foo{
    protected static $test = 'Foo';
    function yourstatic(){
        static $test = 0;
        $test++;
        echo $test . "\n"; 
    }

    function bar(){
        $test = 0;
        $test++;
        echo $test . "\n";
    }
}

$f = new Foo();
$f->yourstatic(); // 1
$f->yourstatic(); // 2
$f->yourstatic(); // 3
$f->bar(); // 1
$f->bar(); // 1
$f->bar(); // 1

?>

Một: 1two: 1 một: 2 một: 3May 31, 2011 at 14:29

Đã trả lời ngày 26 tháng 7 năm 2016 lúc 8:00Pwnna

Tschallackatschallacka20 gold badges63 silver badges91 bronze badges

27K13 Huy hiệu vàng90 Huy hiệu bạc131 Huy hiệu Đồng

Biến tĩnh trong một hàm có nghĩa là cho dù bạn gọi hàm bao nhiêu lần, chỉ có 1 biến.

Đã trả lời ngày 31 tháng 5 năm 2011 lúc 14:29

PWNNAPWNNAMay 31, 2011 at 14:25

8.88020 Huy hiệu vàng63 Huy hiệu bạc91 Huy hiệu ĐồngSpudley

Bên trong một hàm, static có nghĩa là biến sẽ giữ lại giá trị của nó mỗi khi hàm được gọi trong suốt vòng đời của tải trang.39 gold badges229 silver badges305 bronze badges

Chúng ta có thể có biến tĩnh bên trong một phương thức không?

Chúng tôi không thể khai báo các biến tĩnh trong phương thức chính hoặc bất kỳ loại phương thức nào của lớp.Các biến tĩnh phải được khai báo giống như một thành viên lớp trong lớp. or any kind of method of the class. static variables must be declared like a class member in the class.

Làm thế nào có thể sử dụng biến tĩnh trong lớp trong PHP?

Từ khóa tĩnh được sử dụng để khai báo các thuộc tính và phương thức của một lớp là tĩnh.Các thuộc tính và phương thức tĩnh có thể được sử dụng mà không tạo ra một thể hiện của lớp.Từ khóa tĩnh cũng được sử dụng để khai báo các biến trong một hàm giữ giá trị của chúng sau khi hàm kết thúc.. Static properties and methods can be used without creating an instance of the class. The static keyword is also used to declare variables in a function which keep their value after the function has ended.

Giá trị của biến tĩnh có thể được thay đổi trong PHP không?

Trên thực tế, các biến tĩnh trong PHP hoàn toàn không tĩnh .. giá trị của chúng có thể được thay đổi trong quá trình thực thi.Nó chỉ là một biến được chia sẻ của một lớp.their values can be changed during execution. It's just a shared variable of a class.

Chúng ta có thể tăng biến tĩnh trong PHP không?

Hàm tăng_Count () sẽ tăng giá trị của biến tĩnh bằng 1. Từ khóa tự được sử dụng trong tập lệnh để đọc và tăng giá trị của biến tĩnh.echo $ object-> gia tăng_Count (). ". The self keyword is used in the script to read and increment the value of the static variable. echo $object->increment_counter()."