ホームページ  >  記事  >  バックエンド開発  >  PHPにおける静的変数と静的変数の使用に関する分析

PHPにおける静的変数と静的変数の使用に関する分析

不言
不言オリジナル
2018-06-19 10:04:001261ブラウズ

この記事は主に この記事では、PHP の静的変数と静的静的変数の使用に関する詳細情報を紹介します。必要な方は、

静的変数は関数のスコープ内にのみ存在します。つまり、静的変数は関数のスコープ内にのみ存在します。スタック。一般に、関数内の変数 (ローカル変数など) は関数の終了後に解放されますが、静的変数は解放されません。つまり、変数の値は、次回この関数が呼び出されたときにも保持されます。

キーワード static が変数の前に追加されている限り、変数は静的変数になります。

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

プログラム実行結果:
1
2
2
4
3
8

関数 test() の実行後、変数 $nm の値が保存されます。

静的プロパティは、静的メンバーや静的メソッドなどのクラスでよく使用されます。

プログラム リスト: クラスの静的メンバー

静的変数 $nm は、クラスのインスタンスではなく、クラス nowamagic に属します。この変数はすべてのインスタンスに対して有効です。

:: はスコープ修飾演算子です。$this スコープの代わりに self スコープが使用されます。$this スコープはクラスの現在のインスタンスのみを表し、self:: はクラス自体を表します。

<?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();
?>

プログラム実行結果:
1
3
2
5

プログラムリスト: 静的属性

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

プログラム実行結果:

www.nowamagic.net
www.nowmagic. net
www.nowwamagic.net
www.nowamagic.net

プログラム リスト: 単純な静的コンストラクター

PHP には静的コンストラクターがありません。静的クラスを初期化する必要がある場合があります。クラス定義の直後に、クラスの Demonstration() メソッドを呼び出します。

<?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()
?>

プログラムの実行結果:

これはデモンストレーションの結果です()

以下ははじめに PHP 静的変数の使用の概要

静的キーワードは、C# プログラミングでは非常に一般的で、型ではなく型自体に属する静的メンバーを宣言する修飾子として使用されます。特定のオブジェクト。 static 修飾子は、クラス、フィールド、メソッド、プロパティ、演算子、イベント、およびコンストラクターで使用できますが、インデクサー、デストラクター、またはクラス以外の型では使用できません。さらに、C# では、静的修飾子がクラスに追加されると、その内部のすべての変数とメソッドが静的になる必要があります。静的変数と静的メソッドは、インスタンス オブジェクトではなく、クラス名を通じて参照する必要があります。

それでは、PHP と C# の static キーワードの違いは何でしょうか?

宣言範囲

C# と比較して、PHP での静的変数の使用範囲は、クラス、メソッド、または変数の前に追加できるだけでなく、次のこともできます。関数の内部変数に static キーワードを追加することもできます。 static 修飾子が追加された変数の値は、関数が実行された後でも失われません。つまり、変数は次回関数が呼び出されたときにも元の値を記憶しています。例:

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

実行結果は次のとおりです:

3 5 7

やるべきことが 1 つあります。ここで注意してください。変数割り当て操作は、変数が初めて初期化されるときにのみ呼び出されます。この操作は、その後の関数の実行中には呼び出されません。

PHP の関数も第一級市民であるため、C# とは異なり、関数を直接定義し、コード内の任意の場所で直接呼び出すことができます。これは JavaScript に似ています。したがって、現時点では、グローバル変数を定義するよりも関数静的変数の方が便利であり、変数の繰り返し定義によって引き起こされる競合を回避できます。 C# の関数は直接定義して呼び出すことができないため、クラス内でホストする必要があります。そのため、関数に静的変数が必要な場合は、クラス内で定義するだけで同じ効果が得られます。

メソッドの呼び出し

C# では、静的メンバーを呼び出す方法は非常にシンプルで一貫しています。静的メンバーはインスタンス オブジェクトに属さないため、静的メンバーがメソッドであるかどうかは関係ありません。または変数、C# の静的メンバーへのアクセスは常にクラス名.メソッド (変数) を通じて行われます。また、C# では、静的関数を仮想メソッドとして設定したり、オーバーライドしたりすることはできません。 PHP はこれに対して、より柔軟で多様なサポートを提供します。

まず、PHP でのインスタンス メソッドの呼び出しは someobj->someFun() を通じて呼び出されることはわかっていますが、C# のように SomeClass->someFun() を通じて静的関数を呼び出すことはできるでしょうか?答えは「いいえ」です。PHP では、静的メンバーは 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();
?>

実行結果は次のとおりです:

3 1 5

C# とのもう 1 つの違いは、次のとおりです。 , クラス内のメソッドで、静的変数を呼び出す必要がある場合は、self::$somVar 静的変数を渡す必要があります (変数の前の $ 記号に注意してください。インスタンス変数は必要ありません)。メソッドは self::someFun() (ここでは $ 記号は必要ありません)。上の例のように。

另外,与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();
?>

运行结果如下:

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();
?>

运行结果如下:

Test2 Test2

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

总结

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

以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!

相关推荐:

关于PHP中addcslashes与stripcslashes的函数解析

关于PHP模板引擎Smarty内建函数section和sectionelse的用法

以上がPHPにおける静的変数と静的変数の使用に関する分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。