ホームページ バックエンド開発 PHPの問題 PHPメソッドの静的変数とは何ですか

PHPメソッドの静的変数とは何ですか

Oct 25, 2021 am 09:31 AM
php 静的変数

PHP の静的変数は関数スコープ内にのみ存在します。つまり、静的変数はスタック上にのみ存在します。PHP では、キーワード static が変数の前に追加されている限り、変数は静的になります。変数。 。

PHPメソッドの静的変数とは何ですか

この記事の動作環境: Windows7 システム、PHP7.1 バージョン、DELL G3 コンピューター

静的変数とはphpメソッド内で?

静的変数と PHP の静的静的変数の詳細な説明

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

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

<?php
  function test()
  {
    static $nm = ;
    $nm = $nm * ;
    print $nm."<br />";
  }
  // 第一次执行,$nm = 
  test();
  // 第一次执行,$nm = 
  test();
  // 第一次执行,$nm = 
  test();
?>
ログイン後にコピー

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

関数テスト( ) が実行されると、変数 $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.nowamagic.net
www.nowamagic.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 修飾子は、クラス、フィールド、メソッド、プロパティ、演算子、イベント、およびコンストラクターで使用できますが、インデクサー、デストラクター、またはクラス以外の型では使用できません。 static として宣言されたクラス、関数、変数は、インスタンス メソッドや変数を参照できません。また、C# では、static 修飾子がクラスに追加されると、その中のすべての変数とメソッドは static でなければなりません。静的変数と静的メソッドは、インスタンス オブジェクトではなく、クラス名を通じて参照する必要があります。

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

宣言範囲

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

<?php
function test()
{
  static $var=;
  $var+=;
  echo $var.&#39; &#39;;
}
test();
test();
test();
?>
ログイン後にコピー

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

3 5 7


ここで注意すべき点は、変数の代入操作は、変数内で初めて発生します。これは初期化中に呼び出されます。この操作は、後続の関数の実行中には呼び出されません。

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メソッドの静的変数とは何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Dec 24, 2024 pm 04:42 PM

PHP 8.4 では、いくつかの新機能、セキュリティの改善、パフォーマンスの改善が行われ、かなりの量の機能の非推奨と削除が行われています。 このガイドでは、Ubuntu、Debian、またはその派生版に PHP 8.4 をインストールする方法、または PHP 8.4 にアップグレードする方法について説明します。

今まで知らなかったことを後悔している 7 つの PHP 関数 今まで知らなかったことを後悔している 7 つの PHP 関数 Nov 13, 2024 am 09:42 AM

あなたが経験豊富な PHP 開発者であれば、すでにそこにいて、すでにそれを行っていると感じているかもしれません。あなたは、運用を達成するために、かなりの数のアプリケーションを開発し、数百万行のコードをデバッグし、大量のスクリプトを微調整してきました。

PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 Dec 20, 2024 am 11:31 AM

Visual Studio Code (VS Code とも呼ばれる) は、すべての主要なオペレーティング システムで利用できる無料のソース コード エディター (統合開発環境 (IDE)) です。 多くのプログラミング言語の拡張機能の大規模なコレクションを備えた VS Code は、

JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 Apr 05, 2025 am 12:04 AM

JWTは、JSONに基づくオープン標準であり、主にアイデンティティ認証と情報交換のために、当事者間で情報を安全に送信するために使用されます。 1。JWTは、ヘッダー、ペイロード、署名の3つの部分で構成されています。 2。JWTの実用的な原則には、JWTの生成、JWTの検証、ペイロードの解析という3つのステップが含まれます。 3. PHPでの認証にJWTを使用する場合、JWTを生成および検証でき、ユーザーの役割と許可情報を高度な使用に含めることができます。 4.一般的なエラーには、署名検証障害、トークンの有効期限、およびペイロードが大きくなります。デバッグスキルには、デバッグツールの使用とロギングが含まれます。 5.パフォーマンスの最適化とベストプラクティスには、適切な署名アルゴリズムの使用、有効期間を合理的に設定することが含まれます。

PHPでHTML/XMLを解析および処理するにはどうすればよいですか? PHPでHTML/XMLを解析および処理するにはどうすればよいですか? Feb 07, 2025 am 11:57 AM

このチュートリアルでは、PHPを使用してXMLドキュメントを効率的に処理する方法を示しています。 XML(拡張可能なマークアップ言語)は、人間の読みやすさとマシン解析の両方に合わせて設計された多用途のテキストベースのマークアップ言語です。一般的にデータストレージに使用されます

母音を文字列にカウントするPHPプログラム 母音を文字列にカウントするPHPプログラム Feb 07, 2025 pm 12:12 PM

文字列は、文字、数字、シンボルを含む一連の文字です。このチュートリアルでは、さまざまな方法を使用してPHPの特定の文字列内の母音の数を計算する方法を学びます。英語の母音は、a、e、i、o、u、そしてそれらは大文字または小文字である可能性があります。 母音とは何ですか? 母音は、特定の発音を表すアルファベットのある文字です。大文字と小文字など、英語には5つの母音があります。 a、e、i、o、u 例1 入力:string = "tutorialspoint" 出力:6 説明する 文字列「TutorialSpoint」の母音は、u、o、i、a、o、iです。合計で6元があります

PHPでの後期静的結合を説明します(静的::)。 PHPでの後期静的結合を説明します(静的::)。 Apr 03, 2025 am 12:04 AM

静的結合(静的::) PHPで後期静的結合(LSB)を実装し、クラスを定義するのではなく、静的コンテキストで呼び出しクラスを参照できるようにします。 1)解析プロセスは実行時に実行されます。2)継承関係のコールクラスを検索します。3)パフォーマンスオーバーヘッドをもたらす可能性があります。

PHPマジックメソッド(__construct、__destruct、__call、__get、__setなど)とは何ですか? PHPマジックメソッド(__construct、__destruct、__call、__get、__setなど)とは何ですか? Apr 03, 2025 am 12:03 AM

PHPの魔法の方法は何ですか? PHPの魔法の方法には次のものが含まれます。1。\ _ \ _コンストラクト、オブジェクトの初期化に使用されます。 2。\ _ \ _リソースのクリーンアップに使用される破壊。 3。\ _ \ _呼び出し、存在しないメソッド呼び出しを処理します。 4。\ _ \ _ get、dynamic属性アクセスを実装します。 5。\ _ \ _セット、動的属性設定を実装します。これらの方法は、特定の状況で自動的に呼び出され、コードの柔軟性と効率を向上させます。

See all articles