php靜態方法調用非靜態方法
『壹』 php類的靜態(static)方法和靜態(static)變數使用介紹
在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請問在static的function中如何訪問變數
靜態方法只能訪問其他的靜態方法或屬性,比如
classA{
privatestatic$url;
($url){
self::$url=$url;
}
(){
returnself::$url;
}
}
//或者在你的靜態方法中獲得實例,當然這樣的悔鎮話可能達不到你預期的效果,推薦你還是使用上面的方法。
classA{
private$url='demo';
publicstaticfunctiongetUrl(){
陪前磨蘆斗$obj=newself();
return$obj->url;
}
}
『叄』 拍黃片,簡稱php,弱弱的問一下,這小段話該怎麼理解。
這句話 主要就是想表達
PHP可以靜態調用非靜態方法 就是這樣
不過 靜態調用非靜態方法的效率要比標準的靜態方法調用低的多,所以在效率上也不推薦靜態調用非靜態方法。
另外 在代碼的可讀性上來看,靜態調用非靜態方法當然是不被推薦的
所以 在使用java等程序員眼中 php就是亂來 如果這種方法在java程序中使用,肯定會報錯的
『肆』 php中::代表什麼意思
php中的::是調用類中的靜態方法或者常量,屬性的符號
例如
class aaa{
static function ar(){
}
function br(){}
}
使用非靜態方法,要先創建實例
$obj = new aaa();
$obj -> br();
使用靜態方法,無需創建實例,直接使用類名
aaa::ar();
『伍』 PHP靜態方法和非靜態方法的區別
靜態方法必須使用static關鍵字聲明,面向對象編程中我們通常通過類的實例(而不是類的本身)來調用類,類其實是對象的模板,但是靜態方法區別於普通類,它不僅可以通過類的實例來調用,還可以通過類來訪問他們,比如 Game::getGame(); 使用類調用的時候使用::,在當前類調用還可以使用self關鍵字,比如 self::getGame(); 靜態方法是以類為作用域,不能訪問類中的普通屬性,因為他們屬於一個對象,但可以訪問靜態屬性。不知道你明白了沒有
『陸』 thinkphp5是如何做到非靜態方法使用db::table()可以調用
PHP 有個 __callStatic 方法了解一下;
class A {
public static function __callStatic( $name, $args) {
// 當調用了類中不存在的靜態方法時,會自動執行這個方法
// 然後在這個方法中可以去主動調用非靜態方法
return self::$name( ...$args );
// $name 是方法名稱, $args 是調用方法時傳的參數
}
public function demo() {
echo 'this is demo function';
}
}
print_r( A::demo() );
『柒』 php中相同名稱的方法,父類方法為靜態子類能否為非靜態方法
不可以。
子類會繼承父類中的靜態方法,相當於在子類中定義了同名的靜態方法和成員方法。
這樣當在子類上調用該方法時,會產生歧義,因為無法確定調用的是靜態還是非靜態方法,所以編譯器不允許這樣的情況發生。
『捌』 php文件怎樣調用class.php中的方法
調用方法,得看該方法是 靜態方法 還是 非靜態方法
如果類里定義的該方法帶有 static 關鍵字,那麼就是靜態方法
調用靜態方法很簡單,直接 類名::方法名 即可,例如:Person::study();
調用非靜態方法,得先用該類實例化出一個對象,然後才能用對象調用非靜態方法,例如:
$a=new class(); $a->study();
當然不管怎麼調用,如果調用的文件和定義類的文件不是同一個文件,那麼都得在調用的文件里先包含類文件,才能調用方法,包含文件用 include 或 require 後跟字元串文件路徑