php--魔術方法
阿新 • • 發佈:2017-07-24
克隆 amp 作用 href ted 指定 stat 實現 判斷 __construct() 函數並且也沒有從父類繼承一個的話,它就會嘗試尋找舊式的構造函數,也就是和類同名的函數。因此唯一會產生兼容性問題的情況是:類中已有一個名為 __construct() 的方法卻被用於其它用途時。
在 PHP 中以兩個下劃線開頭的方法,__construct(), __destruct (), __call(), __callStatic(),__get(), __set(), __isset(), __unset (), __sleep(), __wakeup(), __toString(), __set_state,() __clone() __autoload()等,被稱為"魔術方法"(Magic methods)。
作用:
魔術方法的引入是對面向對象編程思想的進一步實現,重載就是通過魔術方法來實現的。
為了更好的支持面向對象
為了實現向後兼容性,如果 PHP 5 在類中找不到
<?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--魔術方法