[TOC]
## 【類/對象】相關函數
> [ 類/對象函數參考](http://php.net/manual/zh/ref.classobj.php)
>
### 常用的處理函數
* __NAMESPACE __ ==> 當前命令空間
* __autoload ==> 嘗試加載未定義的類
* call_user_method_array ==> 以參數列表的數組,調用用戶方法
* call_user_method ==> 對特定對象調用用戶方法
* class_alias ==> 為一個類創建別名
* method_exists ==> 檢查類的方法是否存在
* class_exists ==> 檢查類是否已定義
* interface_exists ==> 檢查接口是否已被定義
*
* get_called_class ==> 后期靜態綁定("Late Static Binding")類的名稱
* get_class_methods ==> 返回由類的方法名組成的數組
* get_class_vars ==> 返回由類的默認屬性組成的數組
* get_class ==> 返回對象的類名
* get_parent_class ==> 返回對象或類的父類名
*
* get_declared_classes ==> 返回由已定義類的名字所組成的數組
* get_declared_interfaces ==> 返回一個數組包含所有已聲明的接口
* get_declared_traits ==> 返回所有已定義的 traits 的數組
* get_object_vars ==> 返回由對象屬性組成的關聯數組
* is_a ==> 如果對象屬于該類或該類是此對象的父類則返回 TRUE
* is_subclass_of ==> 如果此對象是該類的子類,則返回 TRUE
* property_exists ==> 檢查對象或類是否具有該屬性
* trait_exists ==> 檢查指定的 trait 是否存在
*
* is_object() 判斷是否是個對象
* instanceof 判斷一個obj是否屬于一個類
> $b instanceof B;
*
* * * * *
### 魔術方法:
訪問不存在或者權限不夠的屬性的時候,自動觸發的魔術方法
* function __get( $name ){ } 獲取屬性的時候自動觸發
* function __set( $name,$value ){ } 設置屬性.....
* function __isset($name){ }
* function __unset($name){ }
* function __call( ){ } 訪問一個非靜態方法
* function __callStatic( ){ } 訪問一個靜態方法
* function __autoload( ){ } 自動加載
*
* spl_autoload_register( callback ); //將用戶自定義的加載函數,注冊到自動加載機制中
*
* function __sleep( ){ } 當對象被當做文件保存時會自動觸發的方法
> 該方法要做的事情,就是返回一個需要保存的對象數據的一個數組
> return array($a,$b);
>
* function __wakeup( ){ }
> 當對象是從文件里讀出來進行反序列化得到對象的時候,會自動觸發的方法
> 用來進行資源的初始化
>
#### PHP 5.3以后新增的魔術方法
__invoke()
在創建實例后,可以直接調用對象
```
<?php
class testClass{
public function __construct(){
echo '__construct';
}
public function __invoke(){
echo '__invoke';
}
}
$n = new testClass;
$n();
// __construct __invoke
```
__callStatic()
它的工作方式類似于 __call() 魔術方法,__callStatic() 是為了處理靜態方法調用,它必須是公共的,并且必須被聲明為靜態的。
```
class A
{
public function __call($name, $args)
{
}
public static function __callStatic($name, $args)
{
}
}
```
### 序列化
* file_put_contents(‘obj.txt’ , serialize($obj));
### 反序列化
* unserialize ;將對應的序列化字符串,反過來構造成原來的數據類型。
> $str = file_get_contents(‘obj.txt’)
> unserialize( $str ); 反序列化
>
### 接口
作用 :專門用于規范整個項目的設計接口的工具稱之為接口
內容:只能是(常量 + 抽象方法)
* 定義語法:interface 接口名{ }
* 實現接口:implements 接口名{ }
* 實現多接口 :class C implements 接口1,接口2{ }
* 接口繼承接口 :interface 新接口 extends 舊接口{ }
### 對象遍歷
對象的遍歷其實就是遍歷對象的屬性(共有屬性),利用foreach遍歷
* * * * *
#### 常見的修飾符:
1. public
2. protected 保護權限(只有自己和子類可以使用)
3. private 私有屬性(子類也不可使用)
4. static 靜態方法
5. abstract 修飾類(抽象類)
> 只能被繼承的類,不能被實例化
> 子類必須實現父類的抽象方法
> 用于規范團隊協作能力
>
6. final
> 修飾類 :該類不能被繼承。
> 修飾方法:不允許子類重寫
>
7.** 注意 : 子類重寫父類方法時,權限一定要比父類開放**
#### 構造方法
* __construct( ) { } 相當于JS中的構造函數
#### 晰構方法
* __destruct( ){ } 對象釋放前自動調用此函數(用于釋放一些資源)
#### 繼承 extends
* 對象->成員
* 類::成員
* parent::成員 常用parent來代替父類類名,來調用父類的方法
* self:: 代表的是當前方法所定義的類空間
* $this 代表當前訪問的對象
#### 終止腳本執行
* return die exit
* * * * *
## 自動加載類__autoload()
在編寫面向對象程序時,常規做法是將每一個類保存為一個PHP源文件。當在一個PHP文件中需要調用一個類時很容易就可以找到,然后通過include(或require)把這個文件引入就可以了。不過有的時候,在項目中文件眾多,要一一將所需類的文件include進來,是一個很讓人頭疼的事。
PHP5提供了一個__autoload()來解決這個問題。當new實例化一個不存在的類時,則自動調用此函數“__autoload()”,并將類名作為參數傳入此函數。我可以使用這個實現類的自動加載。
在組織定義類的文件名時,需要按照一定的規則,最好以類名為中心,加上統一的前綴或后綴形成文件名:class_student.php 或 student_class.php 或 student.php
```
// demo.class.php
<?php
class Demo {
function two() {
echo "222222222222222<br>";
}
}
```
```
// hello.class.php
<?php
class Hello {
function three() {
echo "3333333333333333<br>";
}
}
```
```
// test.class.php
<?php
class Test {
function one() {
echo "1111111111<br>";
}
}
```
```
// test.php
<?php
/*
* 只要在這個腳本中, 需要加載類的時候(必須用到類名),就會自動調用這個方法。
*/
function __autoload($classname) {
echo $classname."<br>";
//Test test.class.php
include strtolower($classname) . '.class.php';
}
$t = new Test();
$t -> one();
$d = new Demo();
$d-> two();
$h = new Hello();
$h -> three();
World::four();
World::four();
World::four();
World::four();
World::four();
World::four();
```
```
// world.class.php
<?php
class World {
static function four() {
echo "44444444444444<br>";
}
}
```