php的魔術方法
㈠ php5中魔術方法函數有哪幾個,請舉例說明各自的用法
__construct() :實例化對象時被調用;
__destuct():當刪除一個對象或者對象操作終止是被執行;
__call():調用對象不存在方法時被調用;
__get():調用對象不存在的屬性時被調用;
__set():設置對象不存在的屬性時被調用;_
_toString():列印一個對象時被調用,比如echo $obj,print($obj);
__clone():克隆對象時被調用,比如$t = new Test();$tt = clone $t;
__sleep():serialize之前被調用,若對象比較大,想做一些刪除在序列化,可以考慮使用該方法;
__wakeup():unserialize之前被調用,做些對象的初始化;
__isset():檢測對象是否存在屬性的時候被調用,如 isset($c->name);
__unset():unset一個對象屬性時被調用,如:unset($c->name);
__set_state():調用var_export時被調用,用__set_state的返回值作為 var_export的返回值;,
__autoload():實例化一個對象時,如果對應的類不存在,在該方法被調用。
希望你能採納,謝謝。
㈡ php什麼是魔術方法
__construct(),
__destruct(),
__call(),
__callStatic(),
__get(),
__set(),
__isset(),
__unset(),
__sleep(),
__wakeup(),
__toString(),
__invoke(),
__set_state(),
__clone()
和
__debugInfo()
等方法在
PHP
中被稱為"魔術方法"(Magic
methods)。在命名自己的類方法時不能使用這些方法名,除非是想使用其魔術功能。
㈢ php 中的魔術函數都有哪些
魔術函數1。__construct()
實例化對象時被調用,
當__construct和以類名為函數名的函數同時存在時,__construct將被調用,另一個不被調用。2。__destruct()
當刪除一個對象或對象操作終止時被調用。3。__call()
對象調用某個方法,
若方法存在,則直接調用;
若不存在,則會去調用__call函數。4。__get()
讀取一個對象的屬性時,
若屬性存在,則直接返回屬性值;
若不存在,則會調用__get函數。5。__set()
設置一個對象的屬性時,
若屬性存在,則直接賦值;
若不存在,則會調用__set函數。6。__toString()
列印一個對象的時被調用。如echo $obj;或print $obj;7。__clone()
克隆對象時被調用。如:$t=new Test();$t1=clone $t;8。__sleep()
serialize之前被調用。若對象比較大,想刪減一點東東再序列化,可考慮一下此函數。9。__wakeup()
unserialize時被調用,做些對象的初始化工作。10。__isset()
檢測一個對象的屬性是否存在時被調用。如:isset($c->name)。11。__unset()
unset一個對象的屬性時被調用。如:unset($c->name)。12。__set_state()
調用var_export時,被調用。用__set_state的返回值做為var_export的返回值。13。__autoload()
實例化一個對象時,如果對應的類不存在,則該方法被調用。魔術常量1。__LINE__
返迴文件中的當前行號。2。__FILE__
返迴文件的完整路徑和文件名。如果用在包含文件中,則返回包含文件名。自 PHP 4.0.2 起,__FILE__ 總是包含一個絕對路徑,而在此之前的版本有時會包含一個相對路徑。3。__FUNCTION__
返回函數名稱(PHP 4.3.0 新加)。自 PHP 5 起本常量返回該函數被定義時的名字(區分大小寫)。在 PHP 4 中該值總是小寫字母的。4。__CLASS__
返回類的名稱(PHP 4.3.0 新加)。自 PHP 5 起本常量返回該類被定義時的名字(區分大小寫)。在 PHP 4 中該值總是小寫字母的。5。__METHOD__
返回類的方法名(PHP 5.0.0 新加)。返回該方法被定義時的名字(區分大小寫)。
(1)初識魔術方法
Php5.0發布以來為我們提供了很多面向對象的特性,尤其是為我們提供了好多易用的魔術方法,這些魔術方法可以讓我們簡化我們的編碼,更好的設計我們的系統。今天我們就來認識下php5.0給我們提供的魔術方法。
㈣ PHP怎麼在子類用父類的魔術方法
父類的魔術方法:
function __construct()
{
echo '我是父類的構造函數(魔術方法)';
}
function __unset()
{
echo '我是父類的銷毀方法(魔術方法)';
}
子類調用
function index()
{
parent::__construct();
parent::__unset();
}
輸出:
我是父類的構造函數(魔術方法)
我是父類的銷毀方法(魔術方法)
㈤ 詳解php的魔術方法__get()和__set()使用介紹
先看看php官方文檔的解釋:
__set()
is
run
when
writing
data
to
inaccessible
properties.
__get()
is
utilized
for
reading
data
from
inaccessible
properties.
究竟用中文怎麼翻譯呢?
inaccessible
:n.
難達到;難接近;無法理解。
有代碼有真相:
復制代碼
代碼如下:
<?php
error_reporting(E_ALL);
class
stu{
private
$a;
private
$b
=
0;
public
$c;
public
$d
=
0;
//這里的
private
可以用
protected
public
替代
private
function
__get($name)
{
return
123;
}
//這里的
private
也可以用
protected
public
替代
private
function
__set($name,
$value)
{
echo
"This
is
set
function";
}
}
$s
=
new
stu();
var_mp($s->a);
//output:
123
var_mp($s->b);
//output:
123
var_mp($s->c);
//output:
null
var_mp($s->d);
//output:
0
var_mp($s->e);
//output:
123
$s->a
=
3;
//output:
This
is
set
function
$s->c
=
3;
//no
output
$s->f
=
3;
//output:
This
is
set
function
?>
結果分析:
如果沒有__get方法,執行
var_mp($s->a)
var_mp($s->b)
會有致命的錯誤
如果沒有__get方法,執行
var_mp($s->e)
會有一個notice,提示沒有定義屬性
$e
總結:
1.
從一個難以訪問的屬性讀取數據的時候
__get()
方法被調用
2.
向一個難以訪問的屬性賦值的時候
__set()
方法被調用
3.
難以訪問包括:(1)私有屬性,(2)沒有初始化的屬性
4.
__isset()
__unset()
也類似
㈥ PHP __get和__set魔術方法在面向對象中的使用問題
php的面向對象思想編程中聲明方法有三種不同的許可權:public protect private。
public:許可權是最大的,可以內部調用,實例調用等。
protected: 受保護類型,用於本類和繼承類調用。
private: 私有類型,只有在本類中使用。
這些許可權同樣可以應用在變數聲明中。
__set __get 都是php的魔術方法,主要是為了用來改變類的私有屬性用的。
你覺得麻煩可以將private私有的變數改為公共public變數,這個要看需求和個人對面向對象的思考。
追問 : 我想知道的是(用private封裝然後用__set或者__get )和(public設置類的屬性)有什麼不同.都可以取值賦值.
追答 : 沒什麼不同的,實現的效果都一樣,只是private是為了限制訪問入口少一些,或者之前用private時沒有考慮到有如今的調用情況,所以在加了set或get。 比較public是所有人都可以訪問,private是內部人可以訪問,從許可權來看,private會安全一些。
㈦ php魔術方法__tostring
__tostring()方法:在直接輸出對象引用的時候,就不會產生錯誤,而是自動調用了__tostring()方法,輸出__tostring()方法中返回的字元串
通俗來說就是 對象一般是使用print_r() 或 var_mp() 來列印訪問
但對於一般閑的人來說直接 使用 echo 輸出對象時,必定會報錯的,原因是對象無法使用echo的。
這個時候如果想解決這個錯誤,咱們應該怎麼操作呢?
可以很好的利用__tostring()這個魔術方法
但是切記使用__toString() 時返回值一定要使用return 來進行返回。
<?php
header("content-type:text/html;charset=utf-8");
class demo{
public $foo;
public function __construct($foo){
$this->foo=$foo;
}
//定義一個__toString()方法時,返加一個成員屬性$foo
public function __toString(){
return $this->foo;
}
}
$demo=new demo('hello PHP成員');
echo $demo;
㈧ PHP的魔術方法為什麼要用兩個下劃線(
這樣你自定義一些私有函數或方法時就只需要輸入一個下劃線並且不用考慮會不會和內置的方法起沖突了
㈨ php魔術方法。。
在 PHP 里,將所有以 __(兩個下劃線)開頭的類方法保留為魔術方法,所以在定義類方法時,除了上述魔術方法,建議不要以 __ 為前綴。
魔術方法的引入是對面向對象編程思想的進一步實現,重載就是通過魔術方法來實現的。
PHP 魔術方法主要有:
__construct(), __destruct(), __call(), __callStatic(), __get(), __set(), __isset(), __unset(),__sleep(), __wakeup(), __toString(), __invoke(), __set_state(), __clone() 和 __debugInfo() 等。
最常見的是__construct(), __destruct(),__get(), __set()等:
__construct和__destruct是類的構造函數和析構函數。
㈩ php 中的魔術常量有哪些
__sleep()serialize() 函數會檢查類中是否存在一個魔術方法 __sleep()。如果存在,該方法會先被調用,然後才執行序列化操作
__wakeup()unserialize() 會檢查是否存在一個 __wakeup() 方法。如果存在,則會先調用 __wakeup 方法,預先准備對象需要的資源。
__toString() 方法用於一個類被當成字元串時應怎樣回應,例如echo $obj;時調用
__invoke()當嘗試以調用函數的方式調用一個對象時,該方法會被調用
__set_state()起當調用 var_export() 導出類時,此方法會被調用
__debugInfo起當調用 var_mp() 導出類時,此方法會被調用
__set()在給不可訪問屬性賦值時,__set() 會被調用。
__get()讀取不可訪問屬性的值時,__get() 會被調用。
__isset()當對不可訪問屬性調用 isset() 或empty() 時,__isset() 會被調用。
__unset()當對不可訪問屬性調用 unset() 時,__unset() 會被調用。
__call()在對象中調用一個不可訪問方法時,__call() 會被調用。
__callStatic在靜態上下文中調用一個不可訪問方法時,__callStatic() 會被調用。