## 普通方法與靜態方法調用區別
>[info] 類中的普通方法與靜態方法,看似簡單,實則復雜,有時讓人匪夷所思~~
#### 1. 普通方法
* 創建類Demo,并定義一個公共普通方法:test1( )
* 調用語法:
~~~
//1. 創建對象
對象變量名 = new 類名 ;
//2 調用方法
對象變量 -> 普通方法() ;
例如:
$obj = new Demo();
echo $obj -> test2();
~~~
>[info] 也可以將調用普通方法的二步合并為一步:
~~~
(new 類名) -> 普通方法();
例如: (new Demo) -> test2();
~~~
* 演示源碼如下:
~~~
<?php
class Demo{
//定義公共普通方法
public function test1(){
return 'Nomal method:test1';
}
}
//1.創建對象
$obj = new Demo();
//2.用對象來調用普通方法
echo $obj -> test1();
~~~
* 運行結果:
~~~
Nomal method:test1
~~~
* * * * *
#### 2. 靜態方法(static)
* 創建類Demo,并定義一個公共靜態方法:test2( )
* 調用語法:
~~~
類名::靜態方法名(參數列表) ;
例如:
Demo::test2();
~~~
* 演示源碼如下:
~~~
<?php
class Demo{
//定義公共靜態方法
public static function test2(){
return 'Static method:test2';
}
}
//Demo類靜態方法test2()調用
echo Demo::test2();
~~~
* 運行結果:
~~~
Static method:test2
~~~
>[warning] 注意:靜態方法也可以像普通方法一樣:用對象來調用,但不推薦這樣做
* 例如,這樣調用靜態方法也是可以的:
~~~
$obj = new Demo();
echo $obj -> test2(); //test2()是靜態方法
或者:
echo (new Demo) -> test2();
~~~
* 運行結果與使用:類::靜態方法名()調用是一樣的。
* * * * *
#### 3. 普通方法中調用靜態方法
>[info] 靜態方法是所有對象所共享的,而普通方法是所有對象都可以調用的。所以,普通方法中調用靜態方法是可以的。
* 演示源碼:
~~~
<?php
class Demo{
//定義公共普通方法
public function test1(){
//調用靜態方法:test2()
return self::test2();
}
//定義公共靜態方法
public static function test2(){
return 'Static method:test2';
}
}
//創建Demo類對象并調用普通方法test1()
echo (new Demo) -> test1();
~~~
* 演示代碼說明:
(1): 因靜態方法可以像普通方法一樣訪問,所以也可以這樣調用靜態方法:
~~~
public function test1(){
//調用靜態方法,不用self::test2() ,用$this -> test2()
return $this -> test2();
}
~~~
(2): 創建對象與方法調用合并,好處就是省去了定義對象變量名。
>[info] 定義變量名稱,是一件很痛苦的事,寫代碼越多越感有感觸
~~~
//創建Demo類對象并調用普通方法test1()
echo (new Demo) -> test1();
~~~
* * * * *
#### 4. 靜態方法中調用普通方法
>[info] 普通方法中可以訪問靜態方法,那么反過來是否成立呢?
* 讓我們來測試一下吧~~
* 現在我們修改一下源代碼:
~~~
<?php
class Demo{
//定義公共普通方法
public function test1(){
return 'Nomal method:test1';
}
//定義公共靜態方法
public static function test2(){
return $this -> test1();
}
}
//Demo類調用靜態方法test2()
echo Demo::test2();
~~~
* 運行結果:出錯啦!!!
~~~
Fatal error: Using $this when not in object context in 'php文件名'.
~~~
>[danger] 靜態方法是屬于類的,供所有該類的對象所共享。而普通方法是屬于對象的。靜態方法生成于編譯前,這時對象未生成,因為通過對象訪問的普通方法,當然也不能被訪問!
* 我們現在思考一個問題:靜態方法中能否訪問普通屬性?答案是:不能!原因與這個相同。
* * * * *
#### 5. 靜態屬性的訪問
>[info] 靜態方法中,只能訪問靜態屬性,不能訪問普通屬性。但是普通方法中可以訪問靜態屬性,這也上面介紹的:普通訪問中可以訪問靜態方法的原理是一樣的。
* 實例演示:
~~~
<?php
class Demo{
public static $name = 'ThinkPHP';
//定義公共普通方法
public function test1(){
return self::$name;
}
//定義公共靜態方法
public static function test2(){
return self::$name;
}
}
//對象訪問
echo (new Demo) -> test1(); // 返回:ThinkPHP
echo (new Demo) -> name; // 返回:錯誤
//靜態訪問
echo Demo::test2(); // 返回:ThinkPHP
echo Demo::$name; // 返回:ThinkPHP
~~~
>[danger] 盡管我們可以像調用普通方法一樣,用對象調用靜態方法,但卻不能調用靜態屬性,一定要注意!
* * * * *
### 總結:
* 普通方法與靜態方法的盡管寫在一個類中,但卻工作在不同的空間;
* 普通方法可以訪問靜態方法,但反過就不行;
* 靜態屬性必須靜態訪問,但靜態方法除了靜態訪問外,也可以對象訪問。
- 前言[隨時更新]
- 開發環境
- 1.Mac環境
- 2.windows環境
- 模型對象
- 1.創建模型對象
- 2.模型初始化
- 數據對象
- 1.定義數據對象
- 2.創建數據對象
- 1.data方法
- 2.setAttr方法
- 3.__set方法
- 4.查詢數據對象
- 1.getData方法
- 2.getAttr方法
- 3.__get方法
- OOP難點總結
- 1.get_class( )實例講解
- 2.get_called_class( )實例講解
- 3.__call( )實例講解
- 3.__callStatic( )實例講解
- 4.call_user_func_array函數[重點]
- 5.普通方法與靜態方法
- 6.在Model源碼中的應用
- 7.new static 延遲靜態綁定
- PHP標準化規范
- 查詢數據
- 1.獲取單條:get靜態方法
- 2.獲取單條:對象查詢
- 3.獲取多條:all靜態方法
- 4.獲取多條:對象查詢
- 5.獲取字段值:value方法
- 6.獲取列值:column方法
- 7.動態查詢:getBy字段名
- 8.助手函數:model查詢
- 9.加載器:Loader類查詢
- 10.數據庫與模型查詢對比
- 新增數據
- 1.sava方法
- 2.savaAll方法
- 3.create靜態方法
- 4.insert靜態調用
- 更新數據
- 1.單條更新:save方法
- 2.批量更新:saveAll方法
- 3.靜態更新:update方法
- 4.查詢類Query直接更新
- 5. 閉包更新
- 刪除數據
- 1.刪除當前記錄:delete
- 2.靜態條件刪除:destory
- 獲取器
- 1.模型方法:set屬性Attr
- 修改器
- 1.set屬性Attr
- 時間戳
- 1.MySQL中日期類型復習
- 2.時間戳功能詳解
- 軟刪除[重點]
- 1.traits詳解[選學內容]
- 2.SoftDelet類源碼分析
- 3. delete實例刪除
- 4.destroy條件刪除
- 5.restore恢復數據
- 類型轉換
- 1. 規則設置
- 2. 實例演示
- 查詢范圍
- 1. 基本概念
- 2.實例演示