溫馨提示×

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

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

php的static靜態(tài)方法怎么使用

發(fā)布時(shí)間:2022-10-31 10:03:57 來(lái)源:億速云 閱讀:169 作者:iii 欄目:編程語(yǔ)言

本文小編為大家詳細(xì)介紹“php的static靜態(tài)方法怎么使用”,內(nèi)容詳細(xì),步驟清晰,細(xì)節(jié)處理妥當(dāng),希望這篇“php的static靜態(tài)方法怎么使用”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來(lái)學(xué)習(xí)新知識(shí)吧。

php static靜態(tài)方法中的“靜態(tài)”指的是無(wú)需對(duì)類進(jìn)行實(shí)例化,就可以直接調(diào)用這些屬性和方法;而static就是一個(gè)關(guān)鍵字,用來(lái)修飾類的屬性及方法,其使用語(yǔ)法如“class Foo {public static $my_static = 'hello';}”。

PHP static靜態(tài)詳解

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

靜態(tài)成員的定義

用static關(guān)鍵字來(lái)修飾類的屬性、方法,稱這些屬性、方法為靜態(tài)屬性、靜態(tài)方法。

1、靜態(tài)屬性

語(yǔ)法:

static 屬性名

實(shí)例:

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

2、靜態(tài)方法

語(yǔ)法:

static function 方法名{
    //代碼
}

實(shí)例:

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

注:靜態(tài)屬性和方法與對(duì)象屬性和方法一樣,支持設(shè)置 privateprotected、public 三種可見(jiàn)性級(jí)別。

靜態(tài)成員的調(diào)用

1、在類外調(diào)用靜態(tài)屬性/方法

通過(guò) 類名::屬性/方法 的方式調(diào)用。

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

注:預(yù)定義常量 PHP_EOL 表示系統(tǒng)換行符。

結(jié)果:

$staticvalue: zhangsan
$a: hello

通過(guò) 對(duì)象名::屬性/方法 的方式調(diào)用。

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

結(jié)果:

$staticvalue: zhangsan
$a: hello

通過(guò)對(duì)象名 -> 方法調(diào)用、對(duì)象名 -> 屬性會(huì)失敗。

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

結(jié)果:

$staticvalue:
$a: hello

2、在非靜態(tài)方法中調(diào)用靜態(tài)屬性/方法

通過(guò) self::屬性/方法 的方式調(diào)用,self 指向當(dāng)前類,就像 $this 指向當(dāng)前對(duì)象一樣;而在沒(méi)有實(shí)例化的情況下,$this 指針指向的是空對(duì)象,所以不能動(dòng)過(guò)它引用靜態(tài)屬性和方法。

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

結(jié)果:

$staticvalue: zhangsan
$a: hello

3、在靜態(tài)方法中調(diào)用靜態(tài)屬性/方法

與在非靜態(tài)方法中調(diào)用靜態(tài)屬性/方法一樣。

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

結(jié)果:

$staticvalue: zhangsan
$a: hello
$staticvalue: zhangsan
$a: hello

4、調(diào)用另一個(gè)類的靜態(tài)屬性/方法

如果在一個(gè)類中調(diào)用其他類的靜態(tài)屬性和方法,需要通過(guò) 完整類名:: 進(jìn)行引用。

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

結(jié)果:

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

5、調(diào)用private、protected可見(jiàn)性級(jí)別的靜態(tài)屬性/方法

由于private、protected屬性的限制只在類內(nèi)調(diào)用,想在類外調(diào)用,需為外部提供一個(gè)public的方法,方法訪問(wèn)private、protected屬性。術(shù)語(yǔ):類對(duì)外提供接口。

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

結(jié)果:

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

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

靜態(tài)屬性支持動(dòng)態(tài)修改

在實(shí)際應(yīng)用中會(huì)有一個(gè)類的多個(gè)對(duì)象,可能會(huì)共享一份數(shù)據(jù)。類常量和靜態(tài)屬性都可以實(shí)現(xiàn)。靜態(tài)屬性與類常量相似(相同),唯一的區(qū)分是類常量不可以更改,靜態(tài)屬性可以更改。訪問(wèn)方法是一樣的,都可以使用::訪問(wèn)。 靜態(tài)屬性需要加$,常量名前沒(méi)有$,所以訪問(wèn)類常量時(shí)根本不需要加。

1、類常量

<?php
class Myconst {
  const A = 1234;
}
$obj1 = new Myconst();
echo 'A: '.$obj1::A.PHP_EOL;
$obj1->A='aaa';
//$obj1::A='aaa';會(huì)報(bào)錯(cuò)
echo "\r\n";
$obj2 = new Myconst();
echo 'A: '.$obj2::A.PHP_EOL;
?>

結(jié)果:

A: 1234

A: 1234

2、靜態(tài)屬性

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

登錄后復(fù)制

結(jié)果:

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

靜態(tài)成員的繼承和重寫

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

1、靜態(tài)屬性

子類可以重寫父類的靜態(tài)成員變量, 但父類的靜態(tài)變量依然存在, 這兩個(gè)靜態(tài)成員變量是獨(dú)立的. 會(huì)根據(jù)調(diào)用的類名分別進(jìn)行訪問(wèn)。

<?php
class Mystatic
{
    static public $a;           //定義一個(gè)靜態(tài)變量
    static function test()        //定義靜態(tài)方法來(lái)操作并輸出靜態(tài)變量
    {
        self::$a++;
        return self::$a;
    }
}
class Mystatic2 extends  Mystatic          //定義一個(gè)子類
{
    static function test()           //定義子類的靜態(tài)方法
    {
        self::$a++;                 //訪問(wèn)并操作父類的靜態(tài)變量
        return self::$a;
    }
}
$obj1=new Mystatic;                              //新建父類對(duì)象
echo '此時(shí)$a的值為: '.$obj1->test().PHP_EOL;     //通過(guò)對(duì)象調(diào)用靜態(tài)方法test,靜態(tài)屬性$a的值+1
$obj2=new Mystatic;                              //新建另一個(gè)父類對(duì)象
echo '此時(shí)$a的值為: '.$obj2->test().PHP_EOL;     //新父類對(duì)象調(diào)用靜態(tài)方法test,靜態(tài)屬性$a的值+1+1
$obj3=new Mystatic2;                             //新建子類對(duì)象
echo '此時(shí)$a的值為: '.$obj3->test().PHP_EOL;     //子類對(duì)象調(diào)用同名靜態(tài)方法test, 靜態(tài)屬性$a的值+1+1+1
echo Mystatic::$a.PHP_EOL;    //通過(guò)父類::直接訪問(wèn)靜態(tài)成員$a變量
echo $obj1::$a.PHP_EOL;   //通過(guò)對(duì)象名::可以直接訪問(wèn)靜態(tài)成員$a變量
?>

結(jié)果:

此時(shí)$a的值為: 1
此時(shí)$a的值為: 2
此時(shí)$a的值為: 3
3
3

2、靜態(tài)方法

子類可以重寫父類的靜態(tài)方法。

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

通過(guò) __CLASS__ 可以獲取當(dāng)前類的類名,我們分別調(diào)用兩個(gè)類的 getClassName 方法:

結(jié)果:

Mystatic1
Mystatic2

說(shuō)明子類重寫了父類的同名靜態(tài)方法,同樣我們?cè)谧宇惿弦部梢哉{(diào)用父類中的 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();
?>

結(jié)果:

Mystatic1
Mystatic1

為什么第二個(gè)打印的結(jié)果是父類名 Mystatic1 而不是子類名 Mystatic2?這是因?yàn)椋?$this 指針始終指向持有它的引用對(duì)象,而self 指向的是定義時(shí)持有它的類而不是調(diào)用時(shí)的類,為了解決這個(gè)問(wèn)題,從 PHP 5.3 開始,新增了一個(gè)叫做延遲靜態(tài)綁定的特性。

延遲靜態(tài)綁定

延遲靜態(tài)綁定(Late Static Bindings)針對(duì)的是靜態(tài)方法的調(diào)用,使用該特性時(shí)不再通過(guò) self:: 引用靜態(tài)方法,而是通過(guò) static::,如果是在定義它的類中調(diào)用,則指向當(dāng)前類,此時(shí)和 self 功能一樣,如果是在子類或者其他類中調(diào)用,則指向調(diào)用該方法所在的類。

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

結(jié)果:

Mystatic1
Mystatic2

表明后期靜態(tài)綁定生效,即 static 指向的是調(diào)用它的方法所在的類,而不是定義時(shí),所以稱之為延遲靜態(tài)綁定。

此外,還可以通過(guò) static::class 來(lái)指向當(dāng)前調(diào)用類的類名,例如我們可以通過(guò)它來(lái)替代 __CLASS__,這樣上述子類就沒(méi)有必要重寫 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();
?>

結(jié)果:

Mystatic1
Mystatic2
Mystatic1
Mystatic2

同理,self::class 則始終指向的是定義它的類。

靜態(tài)與非靜態(tài)的區(qū)別

  • 靜態(tài)屬性和方法可以直接通過(guò)類引用,所以又被稱作類屬性和類方法。非靜態(tài)屬性和非靜態(tài)方法需要實(shí)例化后通過(guò)對(duì)象引用,因此被稱作對(duì)象屬性和對(duì)象方法。

  • 靜態(tài)屬性保存在類空間,非靜態(tài)屬性保存在對(duì)象空間。非靜態(tài)方法可以訪問(wèn)類中的任何成員(包括靜態(tài)),靜態(tài)方法只能訪問(wèn)類中的靜態(tài)成員。

  • 靜態(tài)方法可以直接調(diào)用,類名調(diào)用和對(duì)象調(diào)用(類名或self::調(diào)用),但是非靜態(tài)方法只能通過(guò)對(duì)象調(diào)用(對(duì)象名或$this->調(diào)用)。

  • 一個(gè)類的所有實(shí)例對(duì)象,共用類中的靜態(tài)屬性。如果修改了這個(gè)類靜態(tài)屬性,那么這個(gè)類的所有對(duì)象都能訪問(wèn)到這個(gè)新值。

  • 靜態(tài)方法和屬性的生命周期跟相應(yīng)的類一樣長(zhǎng),靜態(tài)方法和靜態(tài)屬性會(huì)隨著類的定義而被分配和裝載入內(nèi)存中。一直到線程結(jié)束,靜態(tài)屬性和方法才會(huì)被銷毀。 非靜態(tài)方法和屬性的生命周期和類的實(shí)例化對(duì)象一樣長(zhǎng),只有當(dāng)類實(shí)例化了一個(gè)對(duì)象,非靜態(tài)方法和屬性才會(huì)被創(chuàng)建,而當(dāng)這個(gè)對(duì)象被銷毀時(shí),非靜態(tài)方法也馬上被銷毀。靜態(tài)方法和靜態(tài)變量創(chuàng)建后始終使用同一塊內(nèi)存,而使用實(shí)例的方式會(huì)創(chuàng)建多個(gè)內(nèi)存。但靜態(tài)方法效率上要比實(shí)例化高,靜態(tài)方法的缺點(diǎn)是不自動(dòng)進(jìn)行銷毀,而實(shí)例化的則可以做銷毀。

應(yīng)用場(chǎng)景:

  1. 靜態(tài)方法最適合工具類中方法的定義;比如文件操作,日期處理方法等.

  2. 靜態(tài)變量適合全局變量的定義.

php有什么用

php是一個(gè)嵌套的縮寫名稱,是英文超級(jí)文本預(yù)處理語(yǔ)言,它的語(yǔ)法混合了C、Java、Perl以及php自創(chuàng)新的語(yǔ)法,主要用來(lái)做網(wǎng)站開發(fā),許多小型網(wǎng)站都用php開發(fā),因?yàn)閜hp是開源的,從而使得php經(jīng)久不衰。

讀到這里,這篇“php的static靜態(tài)方法怎么使用”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識(shí)點(diǎn)還需要大家自己動(dòng)手實(shí)踐使用過(guò)才能領(lǐng)會(huì),如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI