導航:首頁 > 編程語言 > php5魔術方法

php5魔術方法

發布時間:2022-09-07 10:34:01

php魔術方法有哪些

1.constuct()構造函數
通常實例化完一個對象之後,都要對該對象的屬性進行初始化!在實例化一個對象的時候,PHP系統會自動的調用一個名字叫作construct()的方法,我們把這個方法叫作「構造方法」!
2.destruct()析構方法
與構造方法是一對,構造方法是在一個對象「出生」的時候由系統自動調用的,而析構方法是在一個對象「消失」的時候由系統自動調用的!
析構方法的名字叫destruct();注意裡面不能有任何的參數!
3.clone()克隆
觸發時機:是在克隆一個對象的時候,對新對象進行初始化的工作
4.autoload()自動載入類
當調用不存在的類的時候自動調用!
5.tostring()
當將對象當成字元串使用的時候自動調用
6.invoke()
當將對象當成函數使用的時候自動調用
7,set()
當對無法訪問的屬性賦值時自動調用(比如:類外調用私有屬性)
8.get()
當對獲取無法訪問的屬性值的時候自動調用
9.unset()
當銷毀無法訪問的屬性的時候自動調用
10.isset()
當判斷無法訪問的屬性是否存在的時候自動調用
11.call()
當調用無法訪問的普通方法時自動觸發

⑵ php5 中魔術方法函數有哪幾個

魔術函數:
9.3 構造函數:__construct()
9.3.1 實例化對象時被調用。
9.3.2 在類中,構造函數是用來初始化對象的,利用構造函數,可以操作對象,並改變它的值。
9.3.3 當__construct和以類名為函數名的函數同時存在時,__construct將被調用,另一個不被調用。
9.3.4 當子類重寫了構造函數,子類被實例化時,只調用子類的構造函數,而父類的構造函數不被調用。
9.4 析構函數:__destruct()
9.4.1 當刪除一個對象或對象操作終止時被調用。
9.4.2 當該對象的所有引用都被刪除,或者對象被顯式銷毀時執行。
9.5 克隆函數:__clone()
9.5.1 當對象被拷貝(克隆)時直接調用。
9.5.2 如$a = new Action(); $a = $object;
9.6 __set($name, $value)
9.6.1 用$object->a = 17的方式給屬性賦值時,如果屬性a存在且是public型,那麼直接給屬性a賦值皆可;
9.6.2 如果屬性a不存在或者是protected/private型,就會調用__set($name, $value)方法。
9.6.3 二個參數:屬性、屬性值。
9.7 __get($name)
9.7.1 用$object->a的方式讀取對象的屬性時,如果屬性a存在且是public型,那麼直接返回該屬性的值;
9.7.2 如果屬性a不存在或者是protected/private修飾的不可直接訪問的類型,就會調該方法並以返回值為准。
9.7.3 一般可以使用該方法使外部可限制性地訪問內部屬性,或者完成類似java中的反射操作。
9.8 __isset($name)
9.8.1 檢測一個對象的屬性是否存在時被調用。
9.8.2 如:isset($c->name),如果name不存在,則觸發該函數。
9.8.3 對不存在或者不可訪問的屬性使用isset()或者empty()時,__isset()會被調用。
9.9 __unset($name)
9.9.1 銷毀一個對象的屬性時被調用。
9.9.2 如:unset($c->name),如果name不存在,則觸發該函數。
9.9.3 當unset一個不存在或者不可訪問的屬性時,__unset()會被調用,否則直接unset該屬性皆可。
9.10 __call($name, $arguments)
9.10.1 當調用不存在或者不可訪問的方法時,會調用__call($name, $arguments)方法。
9.11 __callStatic($name, $arguments)
9.11.1 當在靜態方法中調用不存在或者不可訪問的方法時,會調用__callStatic($name, $arguments)方法。
9.11.2 這個方法 是PHP5.3里才添加的,比較新。
9.12 __toString()
9.12.1 當列印對象時會被直接調用。如 echo $object; 或 print $obj;
9.12.2 注意:這時候php會拋出一個Catchable fatal error錯誤;用print_r列印對象不會觸發此函數。
9.13 __set_state()
9.13.1 用var_export()輸出一個對象時,__set_state()會被調用,輸出內容以該魔術方法的返回值為准。
9.13.2 註:var_export()和var_mp()類似,只是var_export()輸出的內容符合php語法。
9.14 __autoload($name)
9.14.1 實例化一個對象時,如果對應的類不存在,則該方法被調用。
9.14.2 這個函數比較特殊,這個函數並不是作為類的成員方法使用的。
9.14.3 注意:該方法是全局函數,參數是類的名稱。
9.14.4 可以用spl_autoload_register函數來定義其他的函數來代替__autoload
9.15 __sleep()
9.15.1 serialize之前被調用。若對象比較大,想刪減一點東東再序列化,可考慮一下此函數。
9.16 __wakeup()
9.16.1 unserialize時被調用,做些對象的初始化工作。

⑶ 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;

⑷ 請詳細說明一下php5中的魔術方法

PHP處理對象部分的內核完全重新開發過,提供更多功能的同時也提高了性能。在以前版本的php中,處理對象和處理基本類型(數字,字元串)的方式是一樣的。這種方式的缺陷是:當將對象賦值給一個變數時,或者通過參數傳遞對象時,對象將被完全拷貝一份。在新的版本里,上述操作將傳遞引用(可以把引用理解成對象的標識符),而非值。
很多PHP程序員可能甚至沒有察覺到老的對象處理方式。事實上,大多數的php應用都可以很好地運行。或者僅僅需要很少的改動。
私有和受保護成員
PHP5引入了私有和受保護成員變數的概念。我們可以用它來定義類成員的可見性。
例子
受保護成員可以被子類訪問, 而私有成員只能被類本身訪問。

代碼:--------------------------------------------------------------------------------

<?php
class MyClass {
private $Hello = "Hello, World!\n";
protected $Bar = "Hello, Foo!\n";
protected $Foo = "Hello, Bar!\n";

function printHello() {
print "MyClass::printHello() " . $this->Hello;
print "MyClass::printHello() " . $this->Bar;
print "MyClass::printHello() " . $this->Foo;
}
}

class MyClass2 extends MyClass {
protected $Foo;

function printHello() {
MyClass::printHello(); /* Should print */
print "MyClass2::printHello() " . $this->Hello; /* Shouldn't print out anything */
print "MyClass2::printHello() " . $this->Bar; /* Shouldn't print (not declared)*/
print "MyClass2::printHello() " . $this->Foo; /* Should print */
}
}

$obj = new MyClass();
print $obj->Hello; /* Shouldn't print out anything */
print $obj->Bar; /* Shouldn't print out anything */
print $obj->Foo; /* Shouldn't print out anything */
$obj->printHello(); /* Should print */

$obj = new MyClass2();
print $obj->Hello; /* Shouldn't print out anything */
print $obj->Bar; /* Shouldn't print out anything */
print $obj->Foo; /* Shouldn't print out anything */
$obj->printHello();
?>
--------------------------------------------------------------------------------

私有方法和受保護方法
PHP5也引入了私有方法和受保護方法的概念。
例子:

代碼:--------------------------------------------------------------------------------

<?php
class Foo {
private function aPrivateMethod() {
echo "Foo::aPrivateMethod() called.\n";
}

protected function aProtectedMethod() {
echo "Foo::aProtectedMethod() called.\n";
$this->aPrivateMethod();
}
}

class Bar extends Foo {
public function aPublicMethod() {
echo "Bar::aPublicMethod() called.\n";
$this->aProtectedMethod();
}
}

$o = new Bar;
$o->aPublicMethod();
?>
--------------------------------------------------------------------------------

以前的不使用類的老代碼,沒有訪問修飾符(public, protected, private)的代碼可以不經改動運行。
抽象類和抽象方法
Php5也引入了抽象類和抽象方法的概念。抽象方法只是聲明了方法的簽名並不提供它的實現。包含抽象方法的類必須被聲明成抽象類。
例子:

代碼:--------------------------------------------------------------------------------

<?php
abstract class AbstractClass {
abstract public function test();
}

class ImplementedClass extends AbstractClass {
public function test() {
echo "ImplementedClass::test() called.\n";
}
}

$o = new ImplementedClass;
$o->test();
?>
--------------------------------------------------------------------------------

抽象類不能被實例化。以前的不使用抽象類的老代碼可以不經改動運行。
介面
Php5引入了介面。一個類可以實現多個介面。
例子:

代碼:--------------------------------------------------------------------------------

<?php
interface Throwable {
public function getMessage();
}

class MyException implements Throwable {
public function getMessage() {
// ...
}
}
?>
--------------------------------------------------------------------------------

以前的不使用介面的老代碼可以不經改動運行

類的型別提示
PHP5依然是弱類型的,不過在定義函數參數時,可以使用類的型別提示來聲明期望傳入的對象類型
Example

代碼:--------------------------------------------------------------------------------

<?php
interface Foo {
function a(Foo $foo);
}

interface Bar {
function b(Bar $bar);
}

class FooBar implements Foo, Bar {
function a(Foo $foo) {
// ...
}

function b(Bar $bar) {
// ...
}
}

$a = new FooBar;
$b = new FooBar;

$a->a($b);
$a->b($b);
?>
--------------------------------------------------------------------------------

和其他強類型語言一樣,php5類的型別提示在運行期間檢查而非編譯期間檢查。即:

代碼:--------------------------------------------------------------------------------

<?php
function foo(ClassName $object) {
// ...
}
?>
和下面的代碼是一樣的:
<?php
function foo($object) {
if (!($object instanceof ClassName)) {
die("Argument 1 must be an instance of ClassName");
}
}
?>
--------------------------------------------------------------------------------

這個語法只適用於類,不適用於內建類型。
Final

PHP 5 引入了final關鍵字來聲明final成員和final方法。final成員和final方法不能被子類覆蓋。
Example

代碼:--------------------------------------------------------------------------------

<?php
class Foo {
final function bar() {
// ...
}
}
?>
--------------------------------------------------------------------------------

更進一步,可以把類聲明成final。將類聲明成final可以阻止這個類被繼承。final類裡面的方法預設地都是final的,無需再聲明一次。
Example

代碼:--------------------------------------------------------------------------------

<?php
final class Foo {
// class definition
}

// the next line is impossible
// class Bork extends Foo {}
?>
--------------------------------------------------------------------------------

屬性不能定義成為final.
以前的不使用final的老代碼可以不經改動運行.
對象克隆
Php4沒有提供一種機制來讓用戶自己定義復制構造子( constructor)控制對象的復制過程。Php4做二進制的拷貝,因而很精確地復制了對象的所有屬性。
精確地復制對象的所有屬性可能並不是我們一直想要的。有個例子可以很好地說明我們確實需要復制構造子:比如一個GTK Window的對象 a。 a持有它所需要的全部資源。當復制的這個GTK Window到對象b時候,我們更希望b持有新的資源對象。再舉個例子:對象a包含了一個對象c, 當你把對象a 復制到對象c的時候。我們可能更希望對象b包含一個新的對象c的, 而不是一個對象c的引用。(譯者註:這里所說的就是淺克隆和深克隆。)
對象的復制是通過clone這個關鍵字達到的(Clone調用被克隆對象的__clone()方法)。對象的__clone方法不能夠直接被調用。

代碼:--------------------------------------------------------------------------------

<?php
$_of_object = clone $object;
?>
--------------------------------------------------------------------------------

當developer創建對象的一份拷貝的時候,php5將會檢查 __clone()方法是否存在。如果不存在,那麼它就會呼叫預設的__clone()方法,復制對象的所有屬性。如果__clone()方法已經定義過,那麼_clone()方法就會負責設置新對象的屬性。為了方便起見,Engine會預設地復制所有的屬性。所以在__clone()方法中,只需要覆蓋那些需要更改的屬性就可以了。如下:
Example

代碼:--------------------------------------------------------------------------------

<?php
class MyCloneable {
static $id = 0;

function MyCloneable() {
$this->id = self::$id++;
}

function __clone() {
$this->address = "New York";
$this->id = self::$id++;
}
}

$obj = new MyCloneable();

$obj->name = "Hello";
$obj->address = "Tel-Aviv";

print $obj->id . "\n";

$obj_cloned = clone $obj;

print $obj_cloned->id . "\n";
print $obj_cloned->name . "\n";
print $obj_cloned->address . "\n";
?>
--------------------------------------------------------------------------------

統一構造函數
Php5允許開發者聲明一個類的構造方法。擁有構造方法的類在每次創建新的對象的時候都會呼叫這個方法,因此構造方法適合對象在被使用之前的初始化工作
Php4中,構造方法的名稱和類的名稱一樣。考慮到從子類構造方法呼叫父類構造方法的情況是非常普遍的,而將類從一個繼承體系中搬遷引起的父類變更就常常導致需要更改類的構造方法,php4的做法顯然是不太合理的。
Php5引入了一個聲明構建函數的標准方法: __construct().如下:
Example

代碼:--------------------------------------------------------------------------------

<?php
class BaseClass {
function __construct() {
print "In BaseClass constructor\n";
}
}

class SubClass extends BaseClass {
function __construct() {
parent::__construct();
print "In SubClass constructor\n";
}
}

$obj = new BaseClass();
$obj = new SubClass();
?>
--------------------------------------------------------------------------------

為保持向後的兼容性,如果php5不能夠找到 __construct(),它會尋找老式的構造方法,即與類同名的方法。簡單的說,只有當老代碼里包含了一個__construct()方法的時候,才存在一個兼容性的問題。
析構方法
對於面向對象的編程來說,可以定義析構方法是非常有用的一個功能。析構方法可以用來記錄調試信息,關閉資料庫連接等等一些清除收尾的工作。Php4中沒有析構方法,盡管php4已經支持可以注冊一個函數以便請求結束的時候被調用。
Php5引進的析構方法的概念和其他面向對象的語言(比如java)是一致的。當指向這個對象的最後一個引用被銷毀的時候,析構方法被調用,調用完成後釋放內存。注意:析構方法不接受任何參數。
Example

代碼:--------------------------------------------------------------------------------

<?php
class MyDestructableClass {
function __construct() {
print "In constructor\n";
$this->name = "MyDestructableClass";
}

function __destruct() {
print "Destroying " . $this->name . "\n";
}
}

$obj = new MyDestructableClass();
?>
--------------------------------------------------------------------------------

和構建方法一樣,父類的析構方法也不會被隱含調用。子類可以在自己的析構方法通過調用parent::__destruct()來顯式地調用它。
Constants
Php5引入了class級別的常量。

代碼:--------------------------------------------------------------------------------

<?php
class Foo {
const constant = "constant";
}

echo "Foo::constant = " . Foo::constant . "\n";
?>
--------------------------------------------------------------------------------

老的沒有使用const的代碼仍然正常運行。
Exceptions
Php4沒有異常控制。Php5引入了和其它語言(java)相似的異常控制模式。應該注意的是php5裡面支持捕捉全部異常,但是不支持finally子句。
在catch語句塊裡面,可以重新拋出異常。也可以有多個catch語句,在這種情況下,被捕捉到的異常從上往下依次比較和catch語句比較異常,第一個類型匹配的catch語句將會被執行。如果一直搜索到底還沒有發現匹配的catch子句,則尋找下一個try/catch語句。最後不能捕捉的異常將被顯示出來。如果異常被捕捉,那麼程序會接著catch語句塊的下面開始執行。
Example

代碼:--------------------------------------------------------------------------------

<?php
class MyException {
function __construct($exception) {
$this->exception = $exception;
}

function Display() {
print "MyException: $this->exception\n";
}
}

class MyExceptionFoo extends MyException {
function __construct($exception) {
$this->exception = $exception;
}

function Display() {
print "MyException: $this->exception\n";
}
}

try {
throw new MyExceptionFoo('Hello');
}
catch (MyException $exception) {
$exception->Display();
}
catch (Exception $exception) {
echo $exception;
}
?>
--------------------------------------------------------------------------------

上面的例子表明可以定義一個並不繼承自 Exception的異常類,但是,最好還是從Exception繼承並定義自己的異常。這是因為系統內建的Exception類能夠收集到很多有用的信息, 而不繼承它的異常類是得不到這些信息的。下面的php代碼模仿了系統內建Exception類。每個屬性後面都加了注釋。每個屬性都有一個getter,由於這些getter方法經常被系統內部處理調用,所以這些方法被標明了final。
Example

代碼:--------------------------------------------------------------------------------

<?php
class Exception {
function __construct(string $message=NULL, int code=0) {
if (func_num_args()) {
$this->message = $message;
}
$this->code = $code;
$this->file = __FILE__; // of throw clause
$this->line = __LINE__; // of throw clause
$this->trace = debug_backtrace();
$this->string = StringFormat($this);
}

protected $message = 'Unknown exception'; // exception message
protected $code = 0; // user defined exception code
protected $file; // source filename of exception
protected $line; // source line of exception

private $trace; // backtrace of exception
private $string; // internal only!!

final function getMessage() {
return $this->message;
}
final function getCode() {
return $this->code;
}
final function getFile() {
return $this->file;
}
final function getTrace() {
return $this->trace;
}
final function getTraceAsString() {
return self::TraceFormat($this);
}
function _toString() {
return $this->string;
}
static private function StringFormat(Exception $exception) {
// ... a function not available in PHP scripts
// that returns all relevant information as a string
}
static private function TraceFormat(Exception $exception) {
// ... a function not available in PHP scripts
// that returns the backtrace as a string
}
}
?>
--------------------------------------------------------------------------------

如果我們定義的一異常類都是繼承自Exception基類
無兼容性問題。老的代碼不會受到這一特性的影響。
Dereferencing objects returned from functions
Php4中不能再次引用函數返回的對象以進一步呼叫返回對象的方法,而php5是可以的。

代碼:--------------------------------------------------------------------------------

<?php
class Circle {
function draw() {
print "Circle\n";
}
}

class Square {
function draw() {
print "Square\n";
}
}

function ShapeFactoryMethod($shape) {
switch ($shape) {
case "Circle":
return new Circle();
case "Square":
return new Square();
}
}

ShapeFactoryMethod("Circle")->draw();
ShapeFactoryMethod("Square")->draw();
?>
--------------------------------------------------------------------------------

靜態成員變數能夠被初始化。
Example

代碼:--------------------------------------------------------------------------------

<?php
class foo {
static $my_static = 5;
public $my_prop = 'bla';
}

print foo::$my_static;
$obj = new foo;
print $obj->my_prop;
?>
--------------------------------------------------------------------------------

靜態方法
PHP 5 引入了靜態方法,可以在不實例化類的情況下呼叫靜態方法。
Example

代碼:--------------------------------------------------------------------------------

<?php
class Foo {
public static function aStaticMethod() {
// ...
}
}

Foo::aStaticMethod();
?>
--------------------------------------------------------------------------------

偽變數$this不能夠在靜態方法方法中使用。
instanceof
Php5引入了instanceof關鍵字,允許用它來測試一個對象是一個類的實例,或者是一個派生類的實例,或者實現了某個介面
Example

代碼:--------------------------------------------------------------------------------

<?php
class baseClass { }

$a = new baseClass;

if ($a instanceof baseClass) {
echo "Hello World";
}
?>
--------------------------------------------------------------------------------

Static function variables
現在,靜態變數在編譯階段處理。因此程序員可以通過引用為靜態變數賦值。這可以改善性能,不過,不能夠使用對靜態變數的間接引用了。
按引用傳遞的函數參數現在也可以設置預設值了。
Example

代碼:--------------------------------------------------------------------------------

<?php
function my_function(&$var = null) {
if ($var === null) {
die("$var needs to have a value");
}
}
?>
--------------------------------------------------------------------------------

__autoload()
__autoload() 攔截函數在一個未聲明的類被初始化的時候自動調用。該類的名字會被自動傳遞給__autoload()函數。而__autoload()也只有這么唯一的一個參數。
Example

代碼:--------------------------------------------------------------------------------

<?php
function __autoload($className) {
include_once $className . ".php";
}

$object = new ClassName;
?>
--------------------------------------------------------------------------------

可重載的方法呼叫和屬性訪問
方法呼叫和屬性訪問都能夠通過__call, __get() and __set()方法重載。
Example: __get() and __set()

代碼:--------------------------------------------------------------------------------

<?php
class Setter {
public $n;
public $x = array("a" => 1, "b" => 2, "c" => 3);

function __get($nm) {
print "Getting [$nm]\n";

if (isset($this->x[$nm])) {
$r = $this->x[$nm];
print "Returning: $r\n";
return $r;
} else {
print "Nothing!\n";
}
}

function __set($nm, $val) {
print "Setting [$nm] to $val\n";

if (isset($this->x[$nm])) {
$this->x[$nm] = $val;
print "OK!\n";
} else {
print "Not OK!\n";
}
}
}

$foo = new Setter();
$foo->n = 1;
$foo->a = 100;
$foo->a++;
$foo->z++;
var_mp($foo);
?>
--------------------------------------------------------------------------------

Example: __call()

代碼:--------------------------------------------------------------------------------

<?php
class Caller {
private $x = array(1, 2, 3);

function __call($m, $a) {
print "Method $m called:\n";
var_mp($a);
return $this->x;
}
}

$foo = new Caller();
$a = $foo->test(1, "2", 3.4, true);
var_mp($a);
?>
--------------------------------------------------------------------------------

迭代
當和foreach一起使用對象的時候,迭代的方式被重載過了。預設的行為是迭代類的所有屬性。
Example

代碼:--------------------------------------------------------------------------------

<?php
class Foo {
public $x = 1;
public $y = 2;
}

$obj = new Foo;

foreach ($obj as $prp_name => $prop_value) {
// using the property
}
?>
--------------------------------------------------------------------------------

一個類的所有對象都能夠被迭代瀏覽到, 如果這個類實現了一個空的介面:Traversable. 換句話說,實現了Traversable介面的類可以和foreach一起使用。
介面 IteratorAggregate 和Iterator允許指定類的對象在代碼中如何迭代。IteratorAggregate介面有一個方法:getIterator() 必須返回一個數組
Example

代碼:--------------------------------------------------------------------------------

<?php
class ObjectIterator implements Iterator {

private $obj;
private $num;

function __construct($obj) {
$this->obj = $obj;
}
function rewind() {
$this->num = 0;
}
function valid() {
return $this->num < $this->obj->max;
}
function key() {
return $this->num;
}
function current() {
switch($this->num) {
case 0: return "1st";
case 1: return "2nd";
case 2: return "3rd";
default: return $this->num."th";
}
}
function next() {
$this->num++;
}
}

class Object implements IteratorAggregate {

public $max = 3;

function getIterator() {
return new ObjectIterator($this);
}
}

$obj = new Object;

// this foreach ...
foreach($obj as $key => $val) {
echo "$key = $val\n";
}

// matches the following 7 lines with the for directive.
$it = $obj->getIterator();
for($it->rewind(); $it->hasMore(); $it->next) {
$key = $it->current();
$val = $it->key();
echo "$key = $val\n";
}
unset($it);
?>
--------------------------------------------------------------------------------

新的__toString方法
可以通過覆蓋__toString方法來控制對象到字元串的轉換。
Example

代碼:---------------------------------------

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

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

__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中魔術常量的杠杠怎麼打出來

魔術常量
__LINE__ 文件中的當前行號。
__FILE__ 文件的完整路徑和文件名。如果用在被包含文件中,則返回被包含的文件名。自 PHP 4.0.2 起,__FILE__ 總是包含一個絕對路徑(如果是符號連接,則是解析後的絕對路徑),而在此之前的版本有時會包含一個相對路徑。
__DIR__ 文件所在的目錄。如果用在被包括文件中,則返回被包括的文件所在的目錄。它等價於 dirname(__FILE__)。除非是根目錄,否則目錄中名不包括末尾的斜杠。(PHP 5.3.0中新增) =
__FUNCTION__ 函數名稱(PHP 4.3.0 新加)。自 PHP 5 起本常量返回該函數被定義時的名字(區分大小寫)。在 PHP 4 中該值總是小寫字母的。
__CLASS__ 類的名稱(PHP 4.3.0 新加)。自 PHP 5 起本常量返回該類被定義時的名字(區分大小寫)。在 PHP 4 中該值總是小寫字母的。類名包括其被聲明的作用區域(例如 Foo\Bar)。注意自 PHP 5.4 起 __CLASS__ 對 trait 也起作用。當用在 trait 方法中時,__CLASS__ 是調用 trait 方法的類的名字。
__TRAIT__ Trait 的名字(PHP 5.4.0 新加)。自 PHP 5.4 起此常量返回 trait 被定義時的名字(區分大小寫)。Trait 名包括其被聲明的作用區域(例如 Foo\Bar)。
__METHOD__ 類的方法名(PHP 5.0.0 新加)。返回該方法被定義時的名字(區分大小寫)。
__NAMESPACE__ 當前命名空間的名稱(區分大小寫)。此常量是在編譯時定義的(PHP 5.3.0 新增)。

魔術方法
__construct(),__destruct(),__call(),__callStatic(),__get(),__set(),__isset(),__unset(),__sleep(),__wakeup(),__toString(),__invoke(),__set_state()和 __clone() 等方法在 PHP 中被稱為"魔術方法"(Magic methods)。在命名自己的類方法時不能使用這些方法名,除非是想使用其魔術功能。

一般也就這幾個

⑽ php的魔術方法

PHP的魔術方法:

1、__construct() :實例化對象時自動調用。

2、__destruct() :銷毀對象或腳本執行結束時自動調用。

3、__call($name, $args) :調用對象不存在得方法時執行此函數。

4、__get() :獲取對象不存在的屬性時執行此函數。

5、__set() :設置對象不存在的屬性時執行此函數。

6、__isset() : 檢測對象的某個屬性是否存在時執行此函數。

7、__unset() :銷毀對象的某個屬性時執行此函數。

8、__toString() :將對象當作字元串輸出時執行此函數。

9、__clone() :克隆對象時執行此函數。

10、__autoload() :實例化對象時,當類不存在時,執行此函數自動載入類。

11、__sleep() :serialize之前被調用,可以指定要序列化的對象屬性。

12、__wakeup :unserialize之前被調用,可以執行對象的初始化工作。

13、__set_state() :調用var_export時,被調用。用__set_state的返回值做為var_export的返回值。


閱讀全文

與php5魔術方法相關的資料

熱點內容
軍營訓練不聽教官的命令 瀏覽:258
v開頭的音樂播放器是什麼APP 瀏覽:117
單片機是怎麼做出來的 瀏覽:315
博圖怎麼作為opc伺服器 瀏覽:100
編譯做題軟體 瀏覽:293
橋梁檢測pdf 瀏覽:685
化解壓力的一種方法 瀏覽:680
路由器和DSN伺服器有什麼區別 瀏覽:547
android伸縮控制項 瀏覽:851
androidm3u8緩存 瀏覽:234
imphp開源知乎 瀏覽:706
清除網路通配符dos命令 瀏覽:837
鴻蒙系統怎麼快速換回安卓 瀏覽:712
pdf綠色虛擬列印機 瀏覽:213
androidtab框架 瀏覽:147
java轉php的時間戳 瀏覽:640
編譯libstdc依賴 瀏覽:659
清演算法人與原法人的區別 瀏覽:411
家庭裝修下載什麼app軟體 瀏覽:576
美食博主用什麼app拍視頻 瀏覽:817