溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

php的static靜態方法怎么使用

發布時間:2022-10-31 10:03:57 來源:億速云 閱讀:177 作者:iii 欄目:編程語言

本文小編為大家詳細介紹“php的static靜態方法怎么使用”,內容詳細,步驟清晰,細節處理妥當,希望這篇“php的static靜態方法怎么使用”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。

php static靜態方法中的“靜態”指的是無需對類進行實例化,就可以直接調用這些屬性和方法;而static就是一個關鍵字,用來修飾類的屬性及方法,其使用語法如“class Foo {public static $my_static = 'hello';}”。

PHP static靜態詳解

PHP 類屬性和方法都需要在類實例化后才能調用(常量屬性除外),但是,PHP 還提供了靜態屬性和靜態方法,所謂「靜態」指的是無需對類進行實例化,就可以直接調用這些屬性和方法。靜態類不是不可以實例化,而是不需要實例化就可以用。

靜態成員的定義

用static關鍵字來修飾類的屬性、方法,稱這些屬性、方法為靜態屬性、靜態方法。

1、靜態屬性

語法:

static 屬性名

實例:

<?php
class Foo {
  public static $my_static = 'hello';  
}
?>

2、靜態方法

語法:

static function 方法名{
    //代碼
}

實例:

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

注:靜態屬性和方法與對象屬性和方法一樣,支持設置 private、protected、public 三種可見性級別。

靜態成員的調用

1、在類外調用靜態屬性/方法

通過 類名::屬性/方法 的方式調用。

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

注:預定義常量 PHP_EOL 表示系統換行符。

結果:

$staticvalue: zhangsan
$a: hello

通過 對象名::屬性/方法 的方式調用。

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

結果:

$staticvalue: zhangsan
$a: hello

通過對象名 -> 方法調用、對象名 -> 屬性會失敗。

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

結果:

$staticvalue:
$a: hello

2、在非靜態方法中調用靜態屬性/方法

通過 self::屬性/方法 的方式調用,self 指向當前類,就像 $this 指向當前對象一樣;而在沒有實例化的情況下,$this 指針指向的是空對象,所以不能動過它引用靜態屬性和方法。

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

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

結果:

$staticvalue: zhangsan
$a: hello

3、在靜態方法中調用靜態屬性/方法

與在非靜態方法中調用靜態屬性/方法一樣。

<?php
class Mystatic {
  public static $staticvalue = 'zhangsan';
  public static function staticMethod1() {
    $a = 'hello';
    return $a;
  }
  public static function staticMethod2(){
    echo '$staticvalue: '.self::$staticvalue.PHP_EOL;
    echo '$a: '.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 = 'xiaomin';
}
class Mystatic2 {
  public static $staticvalue2 = 'zhangsan';
  public static function staticMethod() {
    echo '$staticvalue1: '.Mystatic1::$staticvalue1.PHP_EOL;
    echo '$staticvalue2: '.self::$staticvalue2.PHP_EOL;

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

結果:

$staticvalue1: xiaomin
$staticvalue2: zhangsan
$staticvalue1: xiaomin
$staticvalue2: zhangsan

5、調用private、protected可見性級別的靜態屬性/方法

由于private、protected屬性的限制只在類內調用,想在類外調用,需為外部提供一個public的方法,方法訪問private、protected屬性。術語:類對外提供接口。

<?php
class Mystatic {
  public static $staticvalue1 = 'zhangsan';
  private static $staticvalue2 = 20;
  protected static $staticvalue3 = 'student';
  private static function staticMethod() {
    $a = 'hello';
    return $a;
  }
  public function port1() {
    echo '$staticvalue1: '.self::$staticvalue1.PHP_EOL;
    echo '$staticvalue2: '.self::$staticvalue2.PHP_EOL;
    echo '$staticvalue3: '.self::$staticvalue3.PHP_EOL;
    echo '$a: '.self::staticMethod().PHP_EOL;
  }
  public static function port2() {
    echo '$staticvalue1: '.self::$staticvalue1.PHP_EOL;
    echo '$staticvalue2: '.self::$staticvalue2.PHP_EOL;
    echo '$staticvalue3: '.self::$staticvalue3.PHP_EOL;
    echo '$a: '.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 'A: '.$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 '$A: '.Mystatic::$A.PHP_EOL;
Mystatic::$A = 6666;
echo '$A: '.Mystatic::$A.PHP_EOL;
$obj1 = new Mystatic();
echo '$A: '.$obj1::$A.PHP_EOL;
Mystatic::$A = 5555;
$obj2 = new Mystatic();
echo '$A: '.$obj2::$A.PHP_EOL;
echo '$A: '.$obj1::$A.PHP_EOL;
?>

登錄后復制

結果:

$A: 1234
$A: 6666
$A: 6666
$A: 5555
$A: 5555

靜態成員的繼承和重寫

和非靜態屬性/方法一樣,靜態屬性和方法也可以被子類繼承,靜態屬性和方法還可以被子類重寫。

1、靜態屬性

子類可以重寫父類的靜態成員變量, 但父類的靜態變量依然存在, 這兩個靜態成員變量是獨立的. 會根據調用的類名分別進行訪問。

<?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 '此時$a的值為: '.$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__ 可以獲取當前類的類名,我們分別調用兩個類的 getClassName 方法:

結果:

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

為什么第二個打印的結果是父類名 Mystatic1 而不是子類名 Mystatic2?這是因為, $this 指針始終指向持有它的引用對象,而self 指向的是定義時持有它的類而不是調用時的類,為了解決這個問題,從 PHP 5.3 開始,新增了一個叫做延遲靜態綁定的特性。

延遲靜態綁定

延遲靜態綁定(Late Static Bindings)針對的是靜態方法的調用,使用該特性時不再通過 self:: 引用靜態方法,而是通過 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是一個嵌套的縮寫名稱,是英文超級文本預處理語言,它的語法混合了C、Java、Perl以及php自創新的語法,主要用來做網站開發,許多小型網站都用php開發,因為php是開源的,從而使得php經久不衰。

讀到這里,這篇“php的static靜態方法怎么使用”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女