# php魔術方法
魔術方法 | 方法用途| 觸發機制|示例
---|---|---|---
__contract | 構造函數 | 示例化類時自動觸發 | [示例](#contract)
__destruct | 析構函數 | 銷毀類時自動觸發 | [示例](#destruct)
__call() | 方法重載 | 對象中調用一個不可訪問方法時自動觸發| [示例](#call)
__callStatic() | 靜態方法重載 | 靜態上下文中調用一個不可訪問方法時自動觸發| [示例](#callstatic)
__get() | 訪問屬性 | 訪問一個不存在或者私有屬性時觸發 | [示例](#get)
__get() | 設置屬性 | 設置一個不存在或者私有屬性時觸發 | [示例](#set)
__toString() | 以字符串輸出這個類 | 以字符串輸出這個類時觸發 | [示例](#tostring)
# contract
```php
<?php
class BaseClass {
function __construct() {
print "In BaseClass constructor\n";
}
}
class SubClass extends BaseClass {
function __construct() {
parent::__construct();
print "In SubClass constructor\n";
}
}
class OtherSubClass extends BaseClass {
// inherits BaseClass's constructor
}
// In BaseClass constructor
$obj = new BaseClass();
// In BaseClass constructor
// In SubClass constructor
$obj = new SubClass();
// In BaseClass constructor
$obj = new OtherSubClass();
```
---
# destruct
析構函數即使在使用 exit() 終止腳本運行時也會被調用。在析構函數中調用 exit() 將會中止其余關閉操作的運行。
```php
//試圖在析構函數(在腳本終止時被調用)中拋出一個異常會導致致命錯誤。
<?php
class MyDestructableClass {
function __construct() {
print "In constructor\n";
$this->name = "MyDestructableClass";
}
function __destruct() {
print "Destroying " . $this->name . "\n";
}
}
$obj = new MyDestructableClass();
```
---
# call
`$name`參數是要調用的方法名稱。`$arguments`參數是一個枚舉數組,包含著要傳遞給方法 $name 的參數。
```php
<?php
class MethodTest
{
public function __call($name, $arguments)
{
// 注意: $name 的值區分大小寫
echo "Calling object method '$name' "
. implode(', ', $arguments). "\n";
}
}
$obj = new MethodTest;
$obj->runTest('in object context');
```
---
# callStatic
`$name`參數是要調用的方法名稱。`$arguments`參數是一個枚舉數組,包含著要傳遞給方法`$name`的參數。
```php
<?php
class MethodTest
{
/** PHP 5.3.0之后版本 */
public static function __callStatic($name, $arguments)
{
// 注意: $name 的值區分大小寫
echo "Calling static method '$name' "
. implode(', ', $arguments). "\n";
}
}
$obj = new MethodTest;
MethodTest::runTest('in static context');
```
---
# get
在程序運行過程中,通過它可以在對象的外部獲取私有成員屬性的值。或者未定義的成員屬性
```php
<?php
class OOP
{
public function __get($name)
{
echo 'get key: '.$name;
}
}
$oop = new OOP();
$oop->name;// output: get key: name
```
# set
__set($name, $value)方法用來設置私有屬性, 給一個未定義的屬性賦值時,此方法會被觸發,傳遞的參數是被設置的屬性名和值。
```php
<?php
class OOP
{
public function __set($name, $value)
{
echo 'get key: '. $name .' value : '.$value;
}
}
$oop = new OOP();
$oop->name = 'shiwenyuan'; // output:get key: name value : shiwenyuan
```
# toString
是在直接輸出對象引用時自動調用的, 前面我們講過對象引用是一個指針,比如 說:`$p=new Person()`中,$p就是一個引用,我們不能使用`echo`直接輸出$p,這樣會輸出**Catchable fatal error: Object of class Person could not be converted to string**這樣的錯誤,如果你在類里面定義了`__toString()`方法,在直接輸出對象引用的時候,就不會產生錯誤,而是自動調用 了`__toString()`方法, 輸出`__toString()`方法中返回的字符,所以`__toString()`方法一定要有個返回值(`return` 語句)。
```php
<?php
// Declare a simple class
class TestClass
{
public $foo;
public function __construct($foo) {
$this->foo = $foo;
}
//定義一個__toString方法,返加一個成員屬性$foo
public function __toString() {
return $this->foo;
}
}
$class = new TestClass('Hello');
//直接輸出對象
echo $class; // output: Hello
```
- 簡介
- php
- php基礎
- php常用數組函數
- php常用字符串函數
- php魔術方法
- php高階
- swoole
- php優化
- workerman
- PHP底層運行機制和原理
- php框架
- laravel
- 前端
- react
- 爬蟲
- Scrapy
- Linux
- IO復用
- nginx
- nginx進程工作原理
- nginx配置
- 正向代理反向代理
- UPSTREAM
- SERVER
- HTTPS
- queue
- kafka
- redis
- DB
- mysql
- 存儲引擎
- 索引
- 鎖
- 觸發器
- 分庫分表
- 三范式
- 負載均衡
- 事務
- EXPLAN
- mysql死鎖
- mysql索引覆蓋與回表
- mysql聚簇索引與非聚簇索引
- NoSql
- memcache
- redis
- mongo
- 網絡協議
- tcp與udp
- https與http
- 架構
- LNMP架構下HTTP請求的調用次序
- 數據結構&算法
- 基礎數據結構
- Linked List
- array
- stack
- queue
- tree
- hash
- heap
- 常見算法
- 排序算法
- 查找算法
- 其他
- php的一些坑
- 常問面試題
- 技術面試最后反問面試官的話
- hr
- redis緩存擊穿、穿透、雪崩
- 面試中回答的不好的問題
- web攻擊防范