PHP類的靜態方法和靜態變數 雙冒號 是什麼意思

2021-06-19 10:56:28 字數 2466 閱讀 8624

在php中,訪問類的方法/變數有兩種方法:

1. 建立物件$object = new class(),然後使用"->"呼叫:$object->attribute/function,前提是該變數/方法可訪問。

2. 直接呼叫類方法/變數:class::attribute/function,無論是靜態/非靜態都可以。但是有前提條件:

a. 如果是變數,需要該變數可訪問。

b. 如果是方法,除了該方法可訪問外,還需要滿足:

b1) 如果是靜態方法,沒有特殊條件;

b2) 如果是非靜態方法,需要改方法中沒有使用$this,即沒有呼叫非靜態的變數/方法,當然,呼叫靜態的變數/方法沒有問題。

然後我們再看一下使用$object->... 和使用class::... 都有什麼區別:

1. 使用$object->... ,需要執行建構函式建立物件;

2. 使用class::... 呼叫靜態方法/變數,不需要執行建構函式建立物件;

3. 使用class::... 呼叫非靜態方法/變數,也不需要執行建構函式建立物件。

然後奇怪的地方就出來了,既然2和3都一樣,那靜態方法/變數存在還有什麼意義呢?

差異還是顯然存在的,如下:

1. 靜態變數

靜態成員只保留乙個變數值,而這個變數值對所有的例項都是有效,也就是說,所有的例項共享這個成員。

2. 靜態方法

靜態方法可以直接使用class::... 來呼叫,而非靜態方法需要滿足一定限制條件才能使用class::.. 的方法呼叫,如之前所述。

php類**中常看到"::"的操作符,這個是作用域限定操作符,是用乙個雙冒號"::"表示,它用來置頂類中不同作用域的級別。左邊是作用域右邊是訪問作用域的成員。

在php中定義的作用域有self和parent兩種(在php6中提供了static作用域)。

self:表示當前類的作用域,與this不同的是它不表示類的某個特定例項,在類之外的**中不能使用self,而且它不能識別自己在繼承中層次的位置。也就是說,當在擴充套件類中使用self時,它呼叫的不是父類的方法,而是擴充套件類的過載的方法。

parent:表示當前類父類的作用域,其餘的跟self特性一樣。

舉例說明php雙冒號::操作符:

view plaincopy to clipboardprint?

<?php   

class forasp   

public function writewebname()   

}   

class cn extends forasp   

}   

$a = new forasp();//例項化父類   

$a->writeurl();//呼叫自身內容   

$b = new cn();   

$b->writewebname();//呼叫父類內容   

?>  

<?php

class forasp

public function writewebname()

}class cn extends forasp

}$a = new forasp();//例項化父類

$a->writeurl();//呼叫自身內容

$b = new cn();

$b->writewebname();//呼叫父類內容

?>

在呼叫靜態方法中也可以使用::來呼叫類中的靜態方法或者屬性,這樣可以減少資源使用,因為每個類的例項都會占有一部分資源。

php6中提出static::作用域,是我們不再需要self::和parent::。希望指向最終的實現功能的類時,就用static::,這個限定符會在**執行前立即計算出繼承層中最後那個類的成員,這一過程叫做延遲繫結。

「雙冒號操作符」也或稱為「作用域限定操作符」(scope resolution operator)可以訪問靜態、const和類中重寫的屬性與方法。

在類定義外使用的話,使用類名呼叫。在php 5.3.0,可以使用變數代替類名。

program list:用變數在類定義外部訪問

view plaincopy to clipboardprint?

<?php   

class fruit    

$classname = fruit;   

echo $classname::const_value; // as of php 5.3.0   

echo fruit::const_value;   

?>  

<?php

class fruit

$classname = fruit;

echo $classname::const_value; // as of php 5.3.0

echo fruit::const_value;

?>

程式執行結果:

fruit color red

program list:呼叫parent方法

program list:使用作用域限定符

PHP類的靜態方法和靜態變數

在php中,訪問類的方法 變數有兩種方法 1.建立物件 object new class 然後使用 呼叫 object attribute function,前提是該變數 方法可訪問。2.直接呼叫類方法 變數 class attribute function,無論是靜態 非靜態都可以。但是有前提條件...

php基礎 27 靜態變數和靜態方法

1 在類中定義靜態變數 訪問修飾符 static 變數名 例如 public static num 0 2 如何訪問靜態變數 如果在類中訪問有兩種方法 self 靜態變數名 類名 靜態變數名 如果在類外訪問 類名 靜態變數名 3 什麼時候需要用靜態變數 當變數需要所有物件共享時,應當使用靜態變數 4...

C 類中靜態變數和靜態方法的使用

靜態成員的提出是為了解決資料共享的問題。實現共享有許多方法,如 設定全域性性的變數或物件是一種方法。但是,全域性變數或物件是有侷限性的。這一章裡,我們主要講述類的靜態成員來實現資料的共享。靜態資料成員 在類中,靜態成員可以實現多個物件之間的資料共享,並且使用靜態資料成員還不會破壞隱藏的原則,即保證了...