php靜態方法調用對象
『壹』 php 什麼時候 靜態方法
當一個方法被執行時才占內存,執行完畢就釋放了,靜態函數載入時會放到靜態區,暫時不佔內存
『貳』 PHP靜態方法和非靜態方法的區別
靜態方法必須使用static關鍵字聲明,面向對象編程中我們通常通過類的實例(而不是類的本身)來調用類,類其實是對象的模板,但是靜態方法區別於普通類,它不僅可以通過類的實例來調用,還可以通過類來訪問他們,比如 Game::getGame(); 使用類調用的時候使用::,在當前類調用還可以使用self關鍵字,比如 self::getGame(); 靜態方法是以類為作用域,不能訪問類中的普通屬性,因為他們屬於一個對象,但可以訪問靜態屬性。不知道你明白了沒有
『叄』 php 使用靜態方法的幾個注意事項說明
1.即使類中的方法並未用static聲明,但其未使用到可改變的類成員變數,在外部仍可用操作符::來調用;
2.以靜態方式(用::操作符)調用的方法中$this的取值是由調用時的上下文決定的!而不是定義他的類!!
例如以下的代碼:
<?php
classTestClass1
{
public$normal_v='normal_vfromTestClass1';
publicstatic$STATIC_V='STATIC_VfromTestClass1';
publicfunctiontest_func1()
{
echo$this->normal_v.'<br/>'.self::$STATIC_V;
}
}
classTestClass2
{
public$normal_v='normal_vfromTestClass2';
publicstatic$STATIC_V='STATIC_VfromTestClass2';
publicfunctiontest_func2()
{大畝
TestClass1::test_func1();
}
}
$t2=newTestClass2();
$t2->test_func2();
這段代碼是輸出會是凳仿族什麼呢,我原以為會是normal_v from TestClass1 <br /> STATIC_V from TestClass1,測試發現其實我錯了,正確的輸出是:
normal_v from TestClass2
STATIC_V from TestClass1
說明:test_func1()雖然是在TestClass1中定義的,但卻是在棗弊TestClass2中調用的,其內部的$this變數則是由TestClass2決定的!
其實這兩個類的關系應該屬於"雙向關聯".
『肆』 php 靜態方法為什麼不能調用this
static關鍵字聲明一個屬性或方法是和類相關的,而不是和類的某個特定的實例相關,因此,這類屬性或方法也稱為「類屬性」或「類方法」。
2. 靜態變數的調用方法:只能使用slef:: 或者 類名:: 訪問,不能使用$this訪問;反之,類的成員變數未聲明為const及static時,只能使用$this訪問,不能用::訪問。
『伍』 php父類如何調用子類的靜態方法或變數
php父類中怎麼調用子類的的靜態屬性了,Oh,my god,如果被面試官問道這種問題,你一定會說shit,fucky question。你會說我很少這么做,況且php對於靜態的操作太隨意了,php在父類調用子類的靜態屬性是一件麻煩的事情。我們知道子類中調用父類的靜態屬性,可以用self::的形式。但是父類調用子類如果用self::就只能調用到父類的靜態屬性。那麼,怎麼辦了?php是不是無法做到了?答案當然是否定的,php中還可以使用在父類中用子類的類名來調用的方法。
不過,這當中仍然存在一個問題,就是如果我有多個類繼承了同一個父類,而且父類的某個函數要用到各個子類的靜態屬性的話,就想當trouble了。這里有個php的朋友提供了一種思路,採用在子類中重載父類的方法使父類得到靜態屬性。父類中使用了get_class函數得到類名,get_class()是父類名,get_class($this)是子類名。好了得到這個再用eval函數做下執行語句就OK啦。例子:
//父類class A {
public function __con(){
//這里主要為讓大家看清楚,所以列印出來類名,供大家學習
echo(get_class($this)).'/';
echo(get_class()).'/';
eval(\$ab = . get_class($this) . ::\$table;);echo $ab;}}//子類Bclass B extends A {
static $table = 'b table';
function __construct(){
$this-__con();}}//子類Cclass C extends A{
static $table = 'c table';
function cc(){
$this-__con();}}//調用
new B; //輸出結果 B A b table
$c = new C;
上面就是php父類調用子類靜態成員的方法,在子類重載父類的方法還是相當不錯的 ,當時聽朋友提起這個時,就異常激動。父類我們也叫做基類,或者底層類。一般都是最先設計,子類就是根據各個需要來設計,所以我們子類修改的可能性比較大,操作靈活性也比較大。
『陸』 PHP 靜態方法怎麼調用父類非靜態方法
子類的靜態方法裡面實例化父類,然後調用父類的非靜態方法。
因為子類的靜態方法調用父類的方法需要使用parent::函數名()或有可能是self::函數名(),子類的靜態方法使用parent::函數名()或有可能是self::函數名()時這個函數名()必須是父類裡面的一個靜態方法,如果不是靜態方法,會報錯Strict Standards: Non-static method parentClass::b() should not be called statically,但是還是會有正確結果喲