6.如果沒有明確的關鍵字(private,protected)限定,類的屬性和方法默認為公有。
[TOC]
## **Static**
聲明類屬性或方法為靜態,就可以不實例化類而直接訪問。
靜態屬性的使用:
* 在類中,通過`self::靜態屬性名`訪問。
* 在類外,通過`類名::靜態屬性名`訪問。
* 不能通過一個類已實例化的對象來訪問。
* 不可以由對象通過 -> 操作符來訪問。
* 只能被初始化為文字或常量(整數或數組),不能使用表達式。
* 不能初始化為另一個變量或函數返回值,也不能指向一個對象。
靜態方法的使用:
* 在類中,通過`self::靜態方法名()`訪問。
* 在類外,通過`類名::靜態方法名()`訪問; 或者通過一個類已實例化的對象通過`對象變量名->靜態方法名()`訪問。
* 在靜態方法中只能訪問靜態屬性/方法,所以類沒有實例化對象的時候,偽變量` $this` 在靜態方法中不可用。
* 用靜態方式調用一個非靜態方法會導致一個 **`E_STRICT`** 級別的錯誤。
>[info] 自 PHP 5.3.0 起,可以用一個變量來動態調用類。但該變量的值不能為關鍵字 *self*,*parent* 或 *static*。
示例:
~~~php
<?php
class?Foo
{
????public?static?$my_static?=?'foo';
????public?function?staticValue()?{
????????return?self::$my_static;
????}
}
class?Bar?extends?Foo
{
????public?function?fooStatic()?{
????????return?parent::$my_static;
????}
}
print?Foo::$my_static?.?"\n";
$foo?=?new?Foo();
print?$foo->staticValue()?.?"\n";
print?$foo->my_static?.?"\n";??????//?Undefined?"Property"?my_static?
print?$foo::$my_static?.?"\n";
$classname?=?'Foo';
print?$classname::$my_static?.?"\n";?//?As?of?PHP?5.3.0
print?Bar::$my_static?.?"\n";
$bar?=?new?Bar();
print?$bar->fooStatic()?.?"\n";
?>
???</programlisting>
??</example>
??<example>
???<title>靜態方法示例</title>
????<programlisting?role="php">
<![CDATA[
<?php
class?Foo?{
????public?static?function?aStaticMethod()?{
????????//?...
????}
}
Foo::aStaticMethod();
$classname?=?'Foo';
$classname::aStaticMethod();?//?自PHP?5.3.0起,可以用一個變量來動態調用類
?>
~~~
## **繼承**
### **接口類 / interface**
### **抽象類 / abstract**
## 類/對象 函數(20個)
1. __autoload — 嘗試加載未定義的類
2. call_user_method_array — 以參數列表的數組,調用用戶方法
3. call_user_method — 對特定對象調用用戶方法
4. class_alias — 為一個類創建別名
5. class_exists — 檢查類是否已定義
6. get_called_class — 后期靜態綁定("Late Static Binding")類的名稱
7. get_class_methods — 返回由類的方法名組成的數組
8. get_class_vars — 返回由類的默認屬性組成的數組
9. get_class — 返回對象的類名
10. get_declared_classes — 返回由已定義類的名字所組成的數組
11. get_declared_interfaces — 返回一個數組包含所有已聲明的接口
12. get_declared_traits — 返回所有已定義的 traits 的數組
13. get_object_vars — 返回由對象屬性組成的關聯數組
14. get_parent_class — 返回對象或類的父類名
15. interface_exists — 檢查接口是否已被定義
16. is_a — 如果對象屬于該類或該類是此對象的父類則返回 TRUE
17. is_subclass_of — 如果此對象是該類的子類,則返回 TRUE
18. method_exists — 檢查類的方法是否存在
19. property_exists — 檢查對象或類是否具有該屬性
20. trait_exists — 檢查指定的 trait 是否存在
## 待考證
### 1靜態方法與實例方法的優劣
* 一般情況下聲明靜態方法的類大多是工具類,并且這些靜態方法不需要訪問類型中的非靜態字段和事件,也就是說靜態方法與該類型中的非靜態字段和事件不具有邏輯上的關聯性。如果一個方法聲明為靜態方法,也意味著不能被重寫,該方法失去面向對象的擴展和多態的特性。
* 靜態方法與實例方法在性能和占用內存上沒有明顯的區別,是否聲明為靜態方法需要從類型的非靜態字段、事件、面向對象擴展和多態這三方面來考慮。**
* 在并發數較少的情況下,在構造方法中實例化并在方法中調用略占優,但三者性能無太大差別。**當并發數較多時**,尤其大并發情況下,優先推薦構造方法中實例化,再其次是方法中實例化,最后再是靜態方法。**高并發情況下,靜態方法對性能影響比較大**。
* 多個線程調用靜態方法,是否會出現并發問題取決于,靜態方法內部是否需要引用共享區內的靜態變量。當線程調用靜態方法時,都會創建一套臨時變量,可見性是在這個線程內部,所以當多個線程調用靜態方法時,并且這個靜態方法沒有引用外部靜態變量的。不會有線程并發的問題。
* 由于靜態方法在內存中只有一份,無論你調用多少次,都是共用的,而且沒有對象的概念,所以不能在靜態方法里面使用$this調用,如果非得調用的話,只能實例化自身類
* 而實例化不一樣,每一個實例化是一個對象,在內存中是多個的。
* 靜態屬性、方法(包括靜態與非靜態)在內存中,只有一個位置(而非靜態屬性,有多少實例化對象,就有多少個屬性)。
- WebAPP
- Linux Command
- 入門
- 處理文件
- 查找文件單詞
- 環境
- 聯網
- Linux
- Linux目錄配置標準:FHS
- Linux文件與目錄管理
- Linux賬號管理與ACL權限設置
- Linux系統資源查看
- 軟件包管理
- Bash
- Daemon/Systemd
- ftp
- Apache
- MySQL
- Command
- Replication
- mysqld
- remote access
- remark
- 限制
- PHP
- String
- Array
- Function
- Class
- File
- JAVA
- Protocals
- http
- mqtt
- IDE
- phpDesigner
- eclipse
- vscode
- Notepad++
- WebAPI
- Javasript
- DOM
- BOM
- Event
- Class
- Module
- Ajax
- Fetch
- Promise
- async/await
- Statements and declarations
- Function
- Framwork
- jQurey
- Types
- Promise
- BootStrap
- v4
- ThinkPHP5
- install
- 定時任務
- CodeIgniter
- React.js
- node.js
- npm
- npm-commands
- npm-folder
- package.json
- Docker and private modules
- module
- webpack.js
- install
- configuration
- package.json
- entry
- modules
- plugins
- Code Splitting
- loaders
- libs
- API
- webpack-cli
- Vue.js
- install
- Compile
- VueAPI
- vuex
- vue-router
- vue-devtools
- vue-cli
- vue-loader
- VDOM
- vue-instance
- components
- template
- Single-File Components
- props
- data
- methods
- computed
- watch
- Event-handling
- Render Func
- remark
- 案例學習
- bootstrap-vue
- modal
- fontAwesome
- Hosting Font Awesome Yourself
- using with jquery
- using with Vue.js
- HTML
- CSS
- plugins
- Chart.js
- D3.js
- phpSpreadSheet
- Guzzle
- Cmder
- Git
- git命令
- git流程
- Postman
- Markdown
- Regular Expressions
- PowerDesigner
- 附錄1-學習資源