Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Penjelasan terperinci tentang fungsi penutupan dan masalah biasa dalam PHP

Penjelasan terperinci tentang fungsi penutupan dan masalah biasa dalam PHP

WBOY
WBOYasal
2023-06-09 09:46:251379semak imbas

Penjelasan terperinci tentang fungsi penutupan dan masalah biasa dalam PHP

Dalam PHP, fungsi penutupan ialah jenis fungsi khas yang membolehkan fungsi diluluskan dan dikembalikan sebagai parameter, dan boleh dihantar di dalam fungsi Akses pembolehubah luaran . Dalam artikel ini, kita akan melihat lebih dekat pada fungsi penutupan dalam PHP dan masalah biasa mereka.

  1. Apakah fungsi penutupan?

Fungsi penutupan ialah fungsi tanpa nama yang boleh mengakses pembolehubah dalam skop definisinya. Biasanya, skop definisi fungsi adalah terhad kepada fungsi itu sendiri, tetapi fungsi penutupan boleh mengakses pembolehubah dalam skop definisi, dan pembolehubah ini masih boleh diakses walaupun selepas fungsi selesai melaksanakan.

Sintaks fungsi penutupan adalah seperti berikut:

$func = function($args) use ($vars) {
  // ...
};

di mana $func ialah rujukan kepada fungsi penutupan, $args ialah parameter yang dihantar kepada fungsi penutupan dan $vars berada dalam fungsi penutupan Pembolehubah yang perlu diakses. Kata kunci penggunaan digunakan untuk menentukan pembolehubah luaran yang perlu diakses oleh fungsi penutupan.

  1. Senario penggunaan fungsi penutupan

Fungsi penutupan biasanya digunakan dalam senario berikut:

  • Fungsi panggil balik: gunakan fungsi penutupan sebagai Parameter dihantar ke fungsi lain untuk dipanggil semasa pelaksanaan.
  • Pengendali acara: Gunakan fungsi penutupan sebagai pengendali acara apabila acara berlaku.
  • Sebagai kaedah objek: Gunakan fungsi penutupan sebagai kaedah objek untuk mengakses pembolehubah berkaitan semasa kitaran hayat objek.
  1. Skop pembolehubah dalam fungsi penutupan

Dalam fungsi penutupan, skop pembolehubah adalah berbeza daripada fungsi biasa. Pertimbangkan kod berikut:

$foo = 1;
$bar = function() {
  echo $foo;
};
$bar(); // Output: Notice: Undefined variable: foo

Di sini, $foo ialah pembolehubah yang ditakrifkan di luar fungsi penutupan dan ralat akan dilaporkan apabila diakses dalam fungsi penutupan. Untuk mengakses pembolehubah luaran dalam fungsi penutupan, pembolehubah mesti dihantar ke fungsi penutupan menggunakan kata kunci penggunaan:

$foo = 1;
$bar = function() use($foo) {
  echo $foo;
};
$bar(); // Output: 1

Apabila menghantar pembolehubah luaran ke fungsi penutupan menggunakan kata kunci penggunaan, pembolehubah boleh diluluskan dengan nilai atau rujukan. Secara lalai, pembolehubah diluluskan mengikut nilai, iaitu, mengubah suai nilai pembolehubah dalam fungsi penutupan tidak akan menjejaskan pembolehubah luaran. Jika anda perlu lulus melalui rujukan, anda boleh menggunakan simbol &:

$foo = 1;
$bar = function() use(&$foo) {
  $foo++;
};
$bar();
echo $foo; // Output: 2
  1. Ralat pengendalian fungsi penutupan

Terdapat beberapa ralat biasa semasa menggunakan fungsi penutupan Nota:

  • Notis: Pembolehubah tidak ditentukan: var

Ralat ini bermakna pembolehubah tidak ditentukan telah diakses. Dalam fungsi penutupan, skop pembolehubah adalah berbeza daripada fungsi biasa, jadi kata kunci penggunaan harus digunakan untuk menghantar pembolehubah ke fungsi penutupan.

  • Ralat maut: Tidak dapat mengakses induk:: apabila skop kelas semasa tiada induk

Apabila fungsi penutupan dicipta dalam kaedah kelas dan pembolehubah kelas induk diakses , ia akan Ralat ini berlaku. Untuk menyelesaikan masalah ini, anda perlu menggunakan kata kunci $this untuk menghantar objek semasa ke fungsi penutupan:

class Foo {
  protected $bar = 'baz';

  public function hello() {
    $callback = function() {
      echo $this->bar;
    };
    $callback();
  }
}

$foo = new Foo();
$foo->hello(); // Output: baz
  • Tidak boleh menggunakan $this sebagai pembolehubah leksikal

Jika dalam penutupan Ralat ini akan berlaku apabila menggunakan kata kunci $ini dalam fungsi. Untuk menyelesaikan masalah ini, anda perlu menggunakan kelas tanpa nama:

class Foo {
  protected $bar = 'baz';

  public function hello() {
    $callback = new class($this->bar) {
      protected $bar;

      public function __construct($bar) {
        $this->bar = $bar;
      }

      public function __invoke() {
        echo $this->bar;
      }
    };
    $callback();
  }
}

$foo = new Foo();
$foo->hello(); // Output: baz
  1. Ringkasan

Fungsi penutupan ialah jenis fungsi khas dalam PHP yang boleh diakses dalam skop definisinya Pembolehubah, biasanya digunakan dalam fungsi panggil balik, pengendali acara dan kaedah objek. Apabila menggunakan fungsi penutupan, anda perlu memberi perhatian kepada skop pembolehubah dan kaedah pengendalian ralat biasa. Dengan mempunyai pemahaman yang mendalam tentang fungsi penutupan, anda boleh lebih memahami ciri-ciri fungsi dalam PHP dan memainkan peranannya dalam projek sebenar.

Atas ialah kandungan terperinci Penjelasan terperinci tentang fungsi penutupan dan masalah biasa dalam PHP. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn