php--魔術方法

來源:互聯網
上載者:User

標籤:找不到   array   auto   引入   複製   msm   用途   app   methods   

在 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--魔術方法

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.