Rumah > pembangunan bahagian belakang > masalah PHP > Apakah pembolehubah statik dalam kaedah php

Apakah pembolehubah statik dalam kaedah php

藏色散人
Lepaskan: 2023-03-13 13:16:01
asal
4346 orang telah melayarinya

Pembolehubah statik dalam PHP hanya wujud dalam skop fungsi, iaitu, pembolehubah statik hanya hidup pada tindanan dalam PHP, selagi kata kunci statik ditambah sebelum pembolehubah, pembolehubah menjadi statik; pembolehubah.

Apakah pembolehubah statik dalam kaedah php

Persekitaran pengendalian artikel ini: sistem Windows 7, PHP versi 7.1, komputer DELL G3

Apakah pembolehubah statik dalam kaedah php?

Penjelasan terperinci tentang pembolehubah statik dan penggunaan pembolehubah statik dalam PHP

Pembolehubah statik hanya wujud dalam skop fungsi, iaitu, pembolehubah statik hanya hidup pada tindanan. Secara amnya, pembolehubah dalam fungsi akan dikeluarkan selepas fungsi tamat, seperti pembolehubah tempatan, tetapi pembolehubah statik tidak akan. Maksudnya, nilai pembolehubah akan dikekalkan apabila fungsi ini dipanggil seterusnya.

Selagi kata kunci statik ditambah sebelum pembolehubah, pembolehubah menjadi pembolehubah statik.

<?php
  function test()
  {
    static $nm = ;
    $nm = $nm * ;
    print $nm."<br />";
  }
  // 第一次执行,$nm = 
  test();
  // 第一次执行,$nm = 
  test();
  // 第一次执行,$nm = 
  test();
?>
Salin selepas log masuk

Hasil pelaksanaan program:
1
2
2
4
3
8

Fungsi Selepas test() dilaksanakan, nilai pembolehubah $nm disimpan.

Sifat statik sering digunakan dalam kelas, seperti ahli statik dan kaedah statik.

Senarai Program: Ahli statik kelas

Pembolehubah statik $nm tergolong dalam kelas nowamagic, bukan pada instance kelas. Pembolehubah ini sah untuk semua keadaan.

:: ialah pengendali pengehad skop Skop kendiri digunakan di sini dan bukannya skop $this hanya mewakili contoh semasa kelas, dan diri:: mewakili kelas itu sendiri.

<?php
  class nowamagic
  {
    public static $nm = ;
    function nmMethod()
    {
      self::$nm += ;
      echo self::$nm . &#39;<br />&#39;;
    }
  }
  $nmInstance = new nowamagic();
  $nmInstance -> nmMethod();
  $nmInstance = new nowamagic();
  $nmInstance -> nmMethod();
?>
Salin selepas log masuk

Keputusan berjalan program:
1
3
2
5

Senarai Program: Atribut statik

<?php
  class NowaMagic
  {
    public static $nm = &#39;www.nowamagic.net&#39;;
    public function nmMethod()
    {
      return self::$nm;
    }
  }
  class Article extends NowaMagic
  {
    public function articleMethod()
    {
      return parent::$nm;
    }
  }
  // 通过作用于限定操作符访问静态变量
  print NowaMagic::$nm . "<br />";
  // 调用类的方法
  $nowamagic = new NowaMagic();
  print $nowamagic->nmMethod() . "<br />";
  print Article::$nm . "<br />";
  $nmArticle = new Article();
  print $nmArticle->nmMethod() . "<br />";
?>
Salin selepas log masuk

Hasil larian program:

www.nowamagic.net
www.nowamagic.net
www.nowamagic.net
www.nowamagic.net

Senarai Program: Pembina statik ringkas

PHP tidak mempunyai pembina statik Anda mungkin perlu memulakan kelas statik Terdapat cara yang sangat mudah untuk memanggil kelas secara langsung kaedah Demonstrasi() kelas.

<?php
function Demonstration()
{
  return &#39;This is the result of demonstration()&#39;;
}
class MyStaticClass
{
  //public static $MyStaticVar = Demonstration(); //!!! FAILS: syntax error
  public static $MyStaticVar = null;
  public static function MyStaticInit()
  {
    //this is the static constructor
    //because in a function, everything is allowed, including initializing using other functions
    self::$MyStaticVar = Demonstration();
  }
} MyStaticClass::MyStaticInit(); //Call the static constructor
echo MyStaticClass::$MyStaticVar;
//This is the result of demonstration()
?>
Salin selepas log masuk

Hasil berjalan program:

Ini adalah hasil demonstrasi()

Berikut ialah pengenalan kepada penggunaan pembolehubah statik PHP statik

Kata kunci statik adalah sangat biasa dalam pengaturcaraan C# Ia digunakan untuk mengubah suai pengisytiharan ahli statik yang tergolong dalam jenis itu sendiri dan bukannya objek tertentu. Pengubah suai statik boleh digunakan pada kelas, medan, kaedah, sifat, pengendali, peristiwa dan pembina, tetapi bukan pada pengindeks, pemusnah atau jenis selain daripada kelas. Kelas, fungsi dan pembolehubah yang diisytiharkan sebagai statik tidak akan dapat merujuk kaedah atau pembolehubah contoh Selain itu, dalam C#, sebaik sahaja pengubah suai statik ditambahkan pada kelas, semua pembolehubah dan kaedah di dalamnya mestilah statik. Pembolehubah statik dan kaedah mesti dirujuk melalui nama kelas dan bukan melalui objek contoh.

Jadi apakah perbezaan antara kata kunci statik dalam PHP dan C#?

Skop pengisytiharan

Berbanding dengan C#, skop penggunaan pembolehubah statik dalam PHP bukan sahaja boleh menambah pengubah suai statik di hadapan kelas, kaedah atau pembolehubah, malah kita boleh Tambah kata kunci statik kepada pembolehubah dalaman fungsi. Nilai pembolehubah dengan pengubah statik ditambah tidak akan hilang walaupun selepas fungsi itu dilaksanakan, maksudnya, pembolehubah masih mengingati nilai asalnya apabila fungsi ini dipanggil. Contohnya:

<?php
function test()
{
  static $var=;
  $var+=;
  echo $var.&#39; &#39;;
}
test();
test();
test();
?>
Salin selepas log masuk

Hasil operasi adalah seperti berikut:

3 5 7

Satu perkara yang perlu diberi perhatian di sini ialah operasi penetapan pembolehubah hanya akan dilakukan pada pembolehubah pertama Ia akan dipanggil semasa pemulaan ini tidak akan dipanggil semasa pelaksanaan fungsi berikutnya.

Memandangkan fungsi dalam PHP juga merupakan warga kelas pertama, tidak seperti C#, kami boleh mentakrifkan secara langsung fungsi dan memanggilnya terus di mana-mana dalam kod, yang agak serupa dengan JavaScript. Oleh itu, pada masa ini, pembolehubah statik fungsi lebih berguna daripada mentakrifkan pembolehubah global, yang boleh mengelakkan konflik yang disebabkan oleh definisi pembolehubah yang berulang. Oleh kerana fungsi dalam C# tidak boleh ditakrifkan dan dipanggil secara langsung, ia mesti dihoskan dalam kelas Oleh itu, jika fungsi memerlukan pembolehubah statik, kita hanya perlu mentakrifkannya dalam kelas untuk mencapai kesan yang sama.

Kaedah panggilan

Dalam C#, cara kita memanggil ahli statik adalah sangat mudah dan konsisten, kerana ahli statik tidak tergolong dalam objek contoh, jadi sama ada ia kaedah atau pembolehubah, Akses C# kepada ahli statiknya sentiasa melalui nama kelas.method (pembolehubah). Dan dalam C#, fungsi statik tidak boleh ditetapkan sebagai kaedah maya atau ditindih. PHP menyediakan sokongan yang lebih fleksibel dan pelbagai untuk ini.

Pertama sekali, kita tahu bahawa kaedah contoh dalam PHP dipanggil melalui someobj->someFun(), jadi bolehkah kita memanggil fungsi statik melalui SomeClass->someFun() seperti C# ? Jawapannya tidak. Dalam PHP, ahli statik hanya boleh dipanggil melalui ::, seperti SomeClass::someFun().

<?php
class TestC
{
  public static $var=;
  public $var=;
  function t()
  {
    self::$var+=;
    echo self::$var.&#39; &#39;;
    echo $this->var.&#39; &#39;;
  }
  public static function t()
  {
    self::$var+=;
    echo self::$var.&#39; &#39;;
  }
}
$t=new TestC();
$t->t();
TestC::t();
?>
Salin selepas log masuk
Salin selepas log masuk

Keputusan yang dijalankan adalah seperti berikut:

3 1 5

Satu lagi perkara yang berbeza daripada C# ialah dalam kaedah dalam kelas, jika kita perlu Untuk memanggil pembolehubah statik, anda mesti lulus pembolehubah statik self::$somVar (perhatikan tanda $ di hadapan pembolehubah, pembolehubah contoh tidak diperlukan), dan untuk memanggil kaedah statik ialah self::someFun( ) (tanda $ tidak diperlukan di sini). Seperti contoh di atas.

另外,与C#最大的不同之处就是,PHP中,子类是可以覆盖父类的静态函数或变量的,不仅如此,(站在C#程序员的角度来看,我觉得PHP这点反而将事情搞复杂了),由于默认self::staticFun()调用的是子类的静态函数,这个时候如果我们想调用父类的静态变量怎么办呢?这里PHP提供了额外的parent来调用基类的静态成员。如:

<?php
class TestC
{
  public static $var=;
  public $var=;
  function t()
  {
    self::$var+=;
    echo self::$var.&#39; &#39;;
    echo $this->var.&#39; &#39;;
  }
  public static function t()
  {
    self::$var+=;
    echo self::$var.&#39; &#39;;
  }
}
$t=new TestC();
$t->t();
TestC::t();
?>
Salin selepas log masuk
Salin selepas log masuk

运行结果如下:

3 5 ‘Hello'

最好,根据上面的例子我们很容易想到,子类访问父类可以使用parent关键字,那么父类如何访问子类的静态方法呢?这里给出static的另外一个用法,这里如果将调用的静态方法前面的作用域换成static的话,PHP会根据该类的继承层次来计算最终的静态方法。如:

<?php
class Test
{
  function t()
  {
    static::t();
  }
  public static function t()
  {
    echo self::&#39;Test &#39;;
  }
}
class Test extends Test
{
  static function t()
  {
    echo self::&#39;Test &#39;;
  }
}
$t=new Test();
$t->t();
Test::t();
?>
Salin selepas log masuk

运行结果如下:

Test2 Test2

这里t实例在t1方法调用t2静态方法时,会根据其实例找到最终的静态方法并输出Test2。

总结

从上面的分析,我们不难看出,对于静态成员的使用,PHP提供了比C#更为强大的功能或灵活性,但从我的角度来看,这种灵活性不见得就更好,从某种角度来看,如果类的继承层次过于复杂,它可能会让我产生混淆。当然,同样的工具不同人使用效果会完全不一样,既然PHP提供了更多样的选择,那么相信如果使用恰当的话,PHP中的static可能会提供比C#中更为强大而简便的使用方式。

推荐学习:《PHP视频教程

Atas ialah kandungan terperinci Apakah pembolehubah statik dalam kaedah php. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:php.cn
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan