PHP物件導向的魔術方法

來源:互聯網
上載者:User

標籤:print   call   exists   類的屬性   storm   傳回值   自動   sse   mob   

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

class Person{

protected $name;
private $age;

private $mobile;

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

}

/**
* 測試使用的不能直接存取的函數
* @param $info
*/
protected function test1($info){
echo ‘我的資訊:‘.$info;
}
private function test2(){
echo ‘我不能被直接存取哦~!~!~‘;
}

// /**
// * @return mixed
// */
// public function getName()
// {
// return $this->name;
// }

/**
* __get魔術方法,當在類的外部調用不能直接存取的屬性時,該函數方法被自動調用
* 下面的格式是該魔術方法的標準形式,不能改變
* 魔術方法必須是公用的(public),且不能定義為靜態(static),除了__callStatic
* __get必須有傳回值,所以最後結束的肯定是return語句
* @param $name 被訪問的屬性的名稱,它必須是一個字串
*/
public function __get($name){
// echo ‘在類中尋找對應名稱的屬性:‘.$name;
if(isset($this->$name)){
return $this->$name;
}else{
return null;
}
}

/**
* 魔術方法__set,當設定類中的不能直接存取的屬性時,自動調用該函數方法
* 下面的格式是該魔術方法的標準形式,不能改變
* __set不需要傳回值
* @param $name 需要設定值的類的屬性名稱
* @param $value 需要設定的值
*/
public function __set($name, $value){
/*
* property_exists 它用於判斷類當中是否包含某個指定名稱的屬性
*/
if (property_exists($this, $name)){
$this->$name=$value;
}
}

/**
* 魔術方法,判斷類中的屬性是否被設定了
* 當對不可訪問屬性調用 isset() 或 empty() 時,__isset() 會被調用。
* @param $name 傳入的是類的屬性名稱
* @return bool 如果屬性存在,則返回true;如果不存在,返回false
*/
function __isset($name){
if (property_exists($this, $name)){
return isset($this->$name);
}else{
return false;
}
}

function __unset($name){
if (property_exists($this, $name)){
$this->$name = null;
}else{
return null;
}
}

/**
* 在對象中調用一個不能直接存取的非靜態方法時,__call() 會被自動調用。
* @param $name 被訪問的函數方法的名稱,字串格式
* @param $arguments 傳遞過來的函數方法的參數,數組格式
*/
function __call($name, $arguments){
// echo ‘需要被訪問的函數名稱:‘.$name;
// var_dump($arguments);
if(method_exists($this, $name)){
call_user_func_array(array($this, $name), $arguments);
}else{
echo ‘沒有對應的函數可以被調用‘;
}

}


/**
* 魔術方法,當以字串格式輸出類的對象時,預設被自動調用
* 該函數方法結束必須有一個return語句,且返回的值必須是字串
*/
function __toString(){
return ‘姓名:‘.$this->name.‘,年齡:‘.$this->age;
// return 100;
}

/**
* 當類的對象被複製時自動調用執行
* 在這裡可以修改被複製的資料值
*/
function __clone(){
echo ‘<br>資料對象被複製了一個備份<br>‘;
$this->age = 35;
}

}

$p = new Person(‘李四‘, 30);
//$p->test1(‘成都‘);
//echo ‘<br><br>‘;
//$p->test2();
//echo ‘<br><br>‘;
//$p->test3();

//echo ‘<br><br>‘;
//echo $p;
//print $p;
echo ‘<br><br>‘;
print_r($p);
echo ‘<br><br>‘;
$p2 = clone $p;
$p2->name = ‘王五‘;
print_r($p2);


//echo ‘<br><br>‘;
//var_dump($p);

//echo $p->name;
//echo $p->age;
//echo $p->mobile;
//var_dump($p);
//
//
//$p->name = ‘成都‘;
//$p->mobile = ‘13066666666‘;
//$p->birth = ‘2000-01-01‘;
//
//unset($p->age);
//echo ‘<br><br>修改後的對象值:‘;
//var_dump($p);
//
//
//if(isset($p->name)){
// echo ‘OK‘;
//}else{
// echo ‘No‘;
//}

 

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.