1. 程式人生 > >php--魔術方法

php--魔術方法

克隆 amp 作用 href ted 指定 stat 實現 判斷

PHP 中以兩個下劃線開頭的方法,__construct(), __destruct (), __call(), __callStatic(),__get(), __set(), __isset(), __unset (), __sleep(), __wakeup(), __toString(), __set_state,() __clone() __autoload()等,被稱為"魔術方法"Magic methods)。

作用:

魔術方法的引入是對面向對象編程思想的進一步實現,重載就是通過魔術方法來實現的。

為了更好的支持面向對象

為了實現向後兼容性,如果 PHP 5 在類中找不到

__construct() 函數並且也沒有從父類繼承一個的話,它就會嘗試尋找舊式的構造函數,也就是和類同名的函數。因此唯一會產生兼容性問題的情況是:類中已有一個名為 __construct() 的方法卻被用於其它用途時。

<?php
/**
* Created by PhpStorm.
* User: fu
* Date: 2017/7/19
* Time: 14:38
*/

class City{

protected $name;
private $area;

function __construct($name, $area){
$this->name = $name;
$this->area = $area;
}

/**
* __get魔術方法,它是在外部訪問該類中不能直接訪問的屬性時自動被調用
* 魔術方法都有其默認的定義格式,不能隨意的更改
* 魔術方法不能被添加static靜態的修飾符,除了__callstatic
* __get魔術方法必須有一個返回值
* @param $name 它對應的是類中的被聲明的屬性的名稱,格式為字符串
*/
function __get($name){
// echo ‘我被調用了:‘.$name;
if(isset($this->$name)){
return $this->$name;
}else{
return null;
}
}

/**
* __set魔術方法,在給類中無法直接訪問的屬性賦值時自動調用
* @param $name 被賦值的類中的屬性名稱,字符串格式
* @param $value 被賦予的值
*/
function __set($name, $value){
// echo ‘我被調用了:‘.$name.‘===‘.$value;
/*
* property_exists 檢測類或者對象中是否包含指定名稱的屬性
*/
if(property_exists($this, $name)){
$this->$name = $value;
}else{
echo ‘類中沒有對應的屬性:‘.$name.‘<br>‘;
}
}

function __isset($name){
if(property_exists($this, $name)){
return isset($this->$name);
}
}
function __unset($name){
// echo ‘需要銷毀的屬性:‘.$name;
if(property_exists($this, $name)){
$this->$name = null;
}else{
unset($this->$name);
}
}



protected function test(){
echo ‘<br>我不能直接訪問test函數方法‘;
}
protected function test1($info){
echo ‘<br>獲取的信息:‘.$info;
}
private function test2($num1, $num2){
echo ‘<br>計算結果:‘.($num1+$num2);
}

/**
* __call 魔術方法
* @param $name 需要被訪問的類中的函數方法的名稱, 格式字符串
* @param $arguments 對應的函數方法的參數值, 格式為數組
*/
function __call($name, $arguments){
/*
* method_exists 判斷類中是否包含某個指定名稱的函數方法
*/
if(method_exists($this, $name)){
// $this->$name();
// call_user_func(array($this, $name), $arguments[0]);
/*
* call_user_func_array 使用它來訪問類中的函數方法,參數個數隨意
*/
call_user_func_array(array($this, $name), $arguments);
}else {
echo ‘沒有找到對應的函數方法<br>‘;
}
}

/**
* __toString魔術方法,當使用字符串的方式來輸出類的對象時被自動調用
* 它要求必須返回一個字符串結果
*/
function __toString(){

return ‘<br>城市名稱:‘.$this->name.‘,面積:‘.$this->area;
}

/**
* __clone魔術方法,當類的對象被克隆時自動被調用
* 默認的克隆時淺克隆模式
* 該方法可以實現克隆時修改某些屬性的值
*/
function __clone(){
echo ‘<br>調用了clone的魔術方法<br>‘;
$this->area = ‘3333平方公裏‘;
}

}



$city = new City(‘成都‘, ‘3000平方公裏‘);
$city2 = clone $city;
var_dump($city);
echo ‘<br>‘;
var_dump($city2);
echo ‘<br>‘;

//var_dump($city);
//echo ‘<br>‘;
//print_r($city);
//echo ‘<br>‘;
//print $city;
//echo $city;

//$city->test();
//$city->test1(‘哈哈哈哈‘);
//$city->test2(100,200);

//echo ‘名稱:‘.$city->name.‘<br>‘;
//echo ‘面積:‘.$city->area.‘<br>‘;
//echo ‘人口:‘.$city->people.‘<br>‘;
//echo ‘<br>‘;
//$city->name = ‘重慶‘;
////$city->people = ‘15000000‘;
//
//unset($city->name);
//
//echo ‘名稱:‘.$city->name.‘<br>‘;
//echo ‘面積:‘.$city->area.‘<br>‘;
//echo ‘人口:‘.$city->people.‘<br>‘;
//echo ‘<br>‘;
//var_dump($city);

//$test = false;
//if(isset($test))
// echo ‘OK‘;

//if(isset($city->people)){
// echo ‘====有值====‘;
//}else{
// echo ‘====沒有獲取到值====‘;
//}

php--魔術方法