ホームページ  >  記事  >  バックエンド開発  >  PHPの静的メソッドとは何ですか

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

藏色散人
藏色散人オリジナル
2022-10-31 09:40:181938ブラウズ

php static 静的メソッドの「静的」は、クラスをインスタンス化せずにこれらのプロパティとメソッドを直接呼び出すことができることを意味します; static は、クラスのプロパティとメソッドを変更するために使用されるキーワードです。その使用構文は次のとおりです。 「class Foo {public static $my_static = 'hello';}」として。

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

このチュートリアルの動作環境: Windows 7 システム、PHP バージョン 8.1、Dell G3 コンピューター。

PHP 静的静的詳細説明

PHP クラスの属性とメソッドは、クラスがインスタンス化された後に呼び出す必要があります (定数属性を除く)。ただし、PHP には静的属性も用意されています。いわゆる「静的」とは、クラスをインスタンス化せずにこれらのプロパティとメソッドを直接呼び出すことができることを意味します。静的クラスはインスタンス化できないわけではありませんが、インスタンス化せずに使用することはできます。

静的メンバーの定義

クラスの属性とメソッドを変更するには static キーワードを使用し、これらの属性とメソッドを静的属性と静的メソッドと呼びます。

1. 静的属性

構文:

static 属性名

例:

<?php
class Foo {
  public static $my_static = &#39;hello&#39;;  
}
?>

2. 静的メソッド

構文:

static function 方法名{
    //代码
}

例:

<?php
class Foo {
  public static function staticValue() {
     return &#39;hello&#39;;
  }
}
?>

注: 静的プロパティとメソッドはオブジェクトのプロパティとメソッドと同じであり、privateprotectedpublic の設定をサポートします。 3 つの可視性レベル。

静的メンバーの呼び出し

1. クラス外の静的プロパティ/メソッドの呼び出し

パス クラス名::プロパティ/メソッド モードで呼び出されます。

<?php
class Mystatic {
  public static $staticvalue = &#39;zhangsan&#39;;
  public static function staticMethod() {
    $a = &#39;hello&#39;;
    return $a;
  }
}
echo &#39;$staticvalue: &#39;.Mystatic::$staticvalue.PHP_EOL;
echo &#39;$a: &#39;.Mystatic::staticMethod().PHP_EOL;
?>

注: 事前定義定数 PHP_EOL はシステムの改行文字を表します。

結果:

$staticvalue: zhangsan
$a: hello

オブジェクト名::プロパティ/メソッド によって呼び出されます。

<?php
class Mystatic {
  public static $staticvalue = &#39;zhangsan&#39;;
  public static function staticMethod() {
    $a = &#39;hello&#39;;
    return $a;
  }
}
$obj = new Mystatic();
echo &#39;$staticvalue: &#39;.$obj::$staticvalue.PHP_EOL;
echo &#39;$a: &#39;.$obj::staticMethod();
?>

結果:

$staticvalue: zhangsan
$a: hello

オブジェクト名->メソッドオブジェクト名->属性#によって呼び出されました。 ## は失敗します。

<?php
error_reporting(0);
class Mystatic {
  public static $staticvalue = &#39;zhangsan&#39;;
  public static function staticMethod() {
    $a = &#39;hello&#39;;
    return $a;
  }
}
$obj = new Mystatic();
echo &#39;$staticvalue: &#39;.$obj -> staticvalue.PHP_EOL;
echo '$a: '.$obj -> staticMethod();
?>
結果:

$staticvalue:
$a: hello
2. 静的プロパティ/メソッドを非静的メソッドで呼び出す

パス

self::properties/methods が呼び出されると、$this が現在のオブジェクトを指すのと同じように、self は現在のクラス を指し、インスタンス化がない場合は、$this になります。ポインターは空のオブジェクト を指しているため、静的プロパティやメソッドを参照するためにタッチすることはできません。

<?php
class Mystatic {
  public static $staticvalue = &#39;zhangsan&#39;;
  public static function staticMethod() {
    $a = &#39;hello&#39;;
    return $a;
  }
  public function noStatic(){
    echo &#39;$staticvalue: &#39;.self::$staticvalue.PHP_EOL;
    echo &#39;$a: &#39;.self::staticMethod();

  }
}
$obj = new Mystatic();
$obj -> noStatic();
?>
結果:

$staticvalue: zhangsan
$a: hello
3. 静的メソッド

での静的プロパティ/メソッドの呼び出しは、非静的メソッドでの静的プロパティ/メソッドの呼び出しと同じです。

<?php
class Mystatic {
  public static $staticvalue = &#39;zhangsan&#39;;
  public static function staticMethod1() {
    $a = &#39;hello&#39;;
    return $a;
  }
  public static function staticMethod2(){
    echo &#39;$staticvalue: &#39;.self::$staticvalue.PHP_EOL;
    echo &#39;$a: &#39;.self::staticMethod1().PHP_EOL;

  }
}
Mystatic::staticMethod2();
$obj = new Mystatic();
$obj -> staticMethod2();
?>
結果:

$staticvalue: zhangsan
$a: hello
$staticvalue: zhangsan
$a: hello
4. 別のクラスの静的プロパティ/メソッドを呼び出す

あるクラスで他のクラスの静的プロパティとメソッドを呼び出す場合は、次のものが必要です。

完全なクラス名:: を参照用に渡します。

<?php
class Mystatic1 {
  public static $staticvalue1 = &#39;xiaomin&#39;;
}
class Mystatic2 {
  public static $staticvalue2 = &#39;zhangsan&#39;;
  public static function staticMethod() {
    echo &#39;$staticvalue1: &#39;.Mystatic1::$staticvalue1.PHP_EOL;
    echo &#39;$staticvalue2: &#39;.self::$staticvalue2.PHP_EOL;

  }
}
Mystatic2::staticMethod();
$obj = new Mystatic2();
$obj -> staticMethod();
?>
結果:

$staticvalue1: xiaomin
$staticvalue2: zhangsan
$staticvalue1: xiaomin
$staticvalue2: zhangsan
5.

privateprotected 静的プロパティ/メソッドを可視性レベルで呼び出します

Due to

private 属性と protected 属性は、クラス内での呼び出しに制限されています。クラス外で呼び出したい場合は、そのクラスに public メソッドを提供する必要があります。このメソッドは、private protected 属性にアクセスします。用語: クラスは、外部世界へのインターフェイスを提供します。

<?php
class Mystatic {
  public static $staticvalue1 = &#39;zhangsan&#39;;
  private static $staticvalue2 = 20;
  protected static $staticvalue3 = &#39;student&#39;;
  private static function staticMethod() {
    $a = &#39;hello&#39;;
    return $a;
  }
  public function port1() {
    echo &#39;$staticvalue1: &#39;.self::$staticvalue1.PHP_EOL;
    echo &#39;$staticvalue2: &#39;.self::$staticvalue2.PHP_EOL;
    echo &#39;$staticvalue3: &#39;.self::$staticvalue3.PHP_EOL;
    echo &#39;$a: &#39;.self::staticMethod().PHP_EOL;
  }
  public static function port2() {
    echo &#39;$staticvalue1: &#39;.self::$staticvalue1.PHP_EOL;
    echo &#39;$staticvalue2: &#39;.self::$staticvalue2.PHP_EOL;
    echo &#39;$staticvalue3: &#39;.self::$staticvalue3.PHP_EOL;
    echo &#39;$a: &#39;.self::staticMethod().PHP_EOL;
  }
}
$obj = new Mystatic();
$obj -> port1();
echo "\r\n";
Mystatic::port2();
?>
結果:

$staticvalue1: zhangsan
$staticvalue2: 20
$staticvalue3: student
$a: hello

$staticvalue1: zhangsan
$staticvalue2: 20
$staticvalue3: student
$a: hello
静的プロパティは動的変更をサポートします

実際のアプリケーションでは、クラスの複数のオブジェクトが存在し、データのコピーを共有する可能性があります。クラス定数と静的プロパティの両方を実装できます。静的プロパティはクラス定数と似ています (同一) が、唯一の違いは、クラス定数は変更できないのに対し、静的プロパティは変更できることです。アクセス方法は同様で、

::でアクセスできます。静的プロパティには $ を追加する必要がありますが、定数名の前に $ がないため、クラス定数にアクセスするときに $ を追加する必要はありません。

1. クラス定数

<?php
class Myconst {
  const A = 1234;
}
$obj1 = new Myconst();
echo &#39;A: &#39;.$obj1::A.PHP_EOL;
$obj1->A='aaa';
//$obj1::A='aaa';会报错
echo "\r\n";
$obj2 = new Myconst();
echo 'A: '.$obj2::A.PHP_EOL;
?>

結果:

A: 1234

A: 1234
2. 静的属性

<?php
class Mystatic {
  public static $A = 1234;
}
echo &#39;$A: &#39;.Mystatic::$A.PHP_EOL;
Mystatic::$A = 6666;
echo &#39;$A: &#39;.Mystatic::$A.PHP_EOL;
$obj1 = new Mystatic();
echo &#39;$A: &#39;.$obj1::$A.PHP_EOL;
Mystatic::$A = 5555;
$obj2 = new Mystatic();
echo &#39;$A: &#39;.$obj2::$A.PHP_EOL;
echo &#39;$A: &#39;.$obj1::$A.PHP_EOL;
?>

結果:

$A: 1234
$A: 6666
$A: 6666
$A: 5555
$A: 5555
静的メンバーの継承

および非静的プロパティ/メソッドのオーバーライドと同様、静的プロパティとメソッドはサブクラスによって継承することもでき、静的プロパティとメソッドはサブクラスによってオーバーライドすることもできます。

1. 静的属性

サブクラスは親クラスの静的メンバー変数をオーバーライドできますが、親クラスの静的メンバー変数は依然として存在します。これら 2 つの静的メンバー変数は独立しています。呼び出しに従って呼び出されます。 クラス名は個別にアクセスされます。

<?php
class Mystatic
{
    static public $a;           //定义一个静态变量
    static function test()        //定义静态方法来操作并输出静态变量
    {
        self::$a++;
        return self::$a;
    }
}
class Mystatic2 extends  Mystatic          //定义一个子类
{
    static function test()           //定义子类的静态方法
    {
        self::$a++;                 //访问并操作父类的静态变量
        return self::$a;
    }
}
$obj1=new Mystatic;                              //新建父类对象
echo &#39;此时$a的值为: &#39;.$obj1->test().PHP_EOL;     //通过对象调用静态方法test,静态属性$a的值+1
$obj2=new Mystatic;                              //新建另一个父类对象
echo '此时$a的值为: '.$obj2->test().PHP_EOL;     //新父类对象调用静态方法test,静态属性$a的值+1+1
$obj3=new Mystatic2;                             //新建子类对象
echo '此时$a的值为: '.$obj3->test().PHP_EOL;     //子类对象调用同名静态方法test, 静态属性$a的值+1+1+1
echo Mystatic::$a.PHP_EOL;    //通过父类::直接访问静态成员$a变量
echo $obj1::$a.PHP_EOL;   //通过对象名::可以直接访问静态成员$a变量
?>
結果:

此时$a的值为: 1
此时$a的值为: 2
此时$a的值为: 3
3
3
2. 静的メソッド

サブクラスは、親クラスの静的メソッドをオーバーライドできます。

<?php
class Mystatic1 {
    public static function getclassName() {
        return __CLASS__;
    }

    public static function whoclassName() {
        echo self::getclassName().PHP_EOL;
    }
}

class Mystatic2 extends Mystatic1{
    public static function getclassName() {
        return __CLASS__;
    }
}

echo Mystatic1::getclassName().PHP_EOL;
echo Mystatic2::getclassName().PHP_EOL;
?>
現在のクラスのクラス名は、

__CLASS__ を通じて取得できます。2 つのクラスの getClassName メソッドをそれぞれ呼び出します:

Result :

Mystatic1
Mystatic2
は、サブクラスが親クラスの同じ名前の静的メソッドをオーバーライドすることを示します。同様に、サブクラスの親クラスの

whoclassName メソッドを呼び出すこともできます:

<?php
class Mystatic1 {
    public static function getclassName() {
        return __CLASS__;
    }

    public static function whoclassName() {
        echo self::getclassName().PHP_EOL;
    }
}

class Mystatic2 extends Mystatic1{
    public static function getclassName() {
        return __CLASS__;
    }
}

echo Mystatic1::whoclassName();
echo Mystatic2::whoclassName();
?>
結果:

Mystatic1
Mystatic1
2 番目に出力される結果が、サブクラス名

Mystatic2 ではなく、親クラス名 Mystatic1 であるのはなぜですか?これは、$this ポインタは常にそれを保持する参照オブジェクトを指すのに対し、self ではなく定義時にそれを保持するクラス を指すためです。呼び出し時のクラス この問題を解決するために、PHP 5.3 からは、Delayed static binding と呼ばれる新機能が追加されました。

延迟静态绑定

延迟静态绑定(Late Static Bindings)针对的是静态方法的调用,使用该特性时不再通过 <span style="background-color:#fe2c24;">self::</span> 引用静态方法,而是通过 static::,如果是在定义它的类中调用,则指向当前类,此时和 self 功能一样,如果是在子类或者其他类中调用,则指向调用该方法所在的类

<?php
class Mystatic1 {
    public static function getclassName() {
        return __CLASS__;
    }

    public static function whoclassName() {
        echo static::getclassName().PHP_EOL;
    }
}

class Mystatic2 extends Mystatic1{
    //self改为static
    public static function getclassName() {
        return __CLASS__;
    }
}
echo Mystatic1::whoclassName();
echo Mystatic2::whoclassName();
?>

结果:

Mystatic1
Mystatic2

表明后期静态绑定生效,即 static 指向的是调用它的方法所在的类,而不是定义时,所以称之为延迟静态绑定。

此外,还可以通过 static::class 来指向当前调用类的类名,例如我们可以通过它来替代 __CLASS__,这样上述子类就没有必要重写 getClassName 方法了:

<?php
class Mystatic1 {
    public static function getclassName() {
        return static::class;
    }

    public static function whoclassName() {
        echo static::getclassName().PHP_EOL;
    }
}

class Mystatic2 extends Mystatic1{}

echo Mystatic1::getclassName().PHP_EOL;
echo Mystatic2::getclassName().PHP_EOL;
echo Mystatic1::whoclassName();
echo Mystatic2::whoclassName();
?>

结果:

Mystatic1
Mystatic2
Mystatic1
Mystatic2

同理,self::class 则始终指向的是定义它的类。

静态与非静态的区别

  • 静态属性和方法可以直接通过类引用,所以又被称作类属性和类方法。非静态属性和非静态方法需要实例化后通过对象引用,因此被称作对象属性和对象方法。

  • 静态属性保存在类空间,非静态属性保存在对象空间。非静态方法可以访问类中的任何成员(包括静态),静态方法只能访问类中的静态成员。

  • 静态方法可以直接调用,类名调用和对象调用(类名或self::调用),但是非静态方法只能通过对象调用(对象名或$this->调用)。

  • 一个类的所有实例对象,共用类中的静态属性。如果修改了这个类静态属性,那么这个类的所有对象都能访问到这个新值。

  • 静态方法和属性的生命周期跟相应的类一样长,静态方法和静态属性会随着类的定义而被分配和装载入内存中。一直到线程结束,静态属性和方法才会被销毁。 非静态方法和属性的生命周期和类的实例化对象一样长,只有当类实例化了一个对象,非静态方法和属性才会被创建,而当这个对象被销毁时,非静态方法也马上被销毁。静态方法和静态变量创建后始终使用同一块内存,而使用实例的方式会创建多个内存。但静态方法效率上要比实例化高,静态方法的缺点是不自动进行销毁,而实例化的则可以做销毁。

应用场景:

  1. 静态方法最适合工具类中方法的定义;比如文件操作,日期处理方法等.

  2. 静态变量适合全局变量的定义.

推荐学习:《PHP视频教程

以上がPHPの静的メソッドとは何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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