您的位置:首页 > 编程语言 > PHP开发

PHP的魔术方法小结

2012-11-02 10:43 169 查看
魔术方法即带有双下划线“__”,在一定的条件下会自动触发的函数。现在的魔术方法有以下14种:1.__construct();2. __destruct();3. __call();4. __callStatic();5.__get();6. __set();7. __isset();8. __unset();9.__sleep();10. __wakeup();11.__toString();12. __invoke();13.
__set_state();14.__clone()

详细介绍:

1.__construct()构造函数:

官网解释:

void __construct ([ mixed $args [, $... ]] )

PHP 5 允行开发者在一个类中定义一个方法作为构造函数。具有构造函数的类会在每次创建新对象时先调用此方法,所以非常适合在使用对象之前做一些初始化工作。

备注:

__construct()中返回值为空,其中可以传递符合类型变量。

例子:

class Person{

private $name;

private $age;

function __construct($name,$age){

$this->name=$name;

$this->age=$age;

}

}

2. __destruct()析构函数:

官方解释:

void __destruct ( void )

PHP 5 引入了析构函数的概念,这类似于其它面向对象的语言,如 C++。析构函数会在到某个对象的所有引用 都被删除或者当对象被显式销毁时执行。备注:

每个对象在new之后,都会在程序结束时调用该类中的析构方法。由于对象的引用都放在栈内存中,而堆栈是先 进后出类型,所以先new的对象会后被析构。例子:

class Person{

private $name;

private $age;

function __construct($name,$age){

$this->name=$name;

$this->age=$age;

}

function __destruct($name,$age){

echo $this->name=$name;

echo $this->age=$age;

}

}

3. __call()方法重载

官方解释:

public mixed __call ( string $name , array $arguments )当调用一个不可访问方法(如未定义,或者不可见)时,__call() 会被调用。

备注:

$name会获得函数名,$argumrnts会获得参数。

实例:

class CallTest{

public function __call($name, $arguments) {

echo $name."is not exist";

echo "this arguments is :

";

var_dump($arguments);

}

}

$obj = new CallTest;

$obj->test('no1','no2');

4.__callStatic()方法重载

官方解释:

public static mixed __callStatic ( string $name , array $arguments )当在静态方法中调用一个不可访问方法(如未定义,或者不可见)时,__callStatic() 会被调用。

备注:

$name会获得函数名,$argumrnts是一个数组会获得参数。并且次魔术方法在PHP 5.3.0之后版本生效

实例:

class CallTest{

public function __callStatic($name, $arguments) {

echo $name."is not exist";

echo "this arguments is :

";

var_dump($arguments);

}

}

$obj = new CallTest;

CallTest::runTest('test');

__set __get __unset __isset都属于属性重载

5.__get()

官方解释:public mixed __get ( string $name )

读取未定义的变量的值时,__get() 会被调用.

备注:

该方法的作用是在程序的运行过程中通过它可以在对象的外部获取私有成员属性的值,它有一个必要的参数,是用,来传递成员属性名并返回一个值。

实例:

class Person{

private $name;

private $age;

private $phone;

function __construct($name="",$age="",$phone=""){

$this->name=$name;

$this->age=$age;

$this->phone=$phone;

}

private function __get($num){

if($this->age>10){

return $this->age;

}else{

return "太小了!!";

}

}

}

$a=new person("a",9,"1231231321");

echo $a->age;

此例子输"太小了"

6. __set()

官方解释:

public void __set ( string $name , mixed $value )

在给未定义的变量赋值时,__set() 会被调用。

备注:

用于对私有成员属性在外部进行设置的时候自动调用。

例子:

<?php

class Person{

private $name;

private $age;

function __construct($name="",$age=""){

$this->name=$name;

$this->age=$age;

}

private function __set($n,$v){

$this->$n=$v;

}

public function say(){

echo "name :".$this->name."<br />";

echo "age :".$this->age;

}

}

$a=new Person("atherse",13);

$a->name="lineagerl";

$a->age=123;

$a->say();

?>

7. __isset();

官方解释:

public bool __isset ( string $name )

当对未定义的变量调用 isset() 或 empty()时,__isset() 会被调用。

备注:

在外部查看私有成员属性时,自动调用,是简介调用isset函数例子:

<?php

class Person{

private $name;

private $age;

function __construct($name="",$age=""){

$this->name=$name;

$this->age=$age;

}

private function __set($n,$v){

$this->$n=$v;

}

private function __isset($n){

return isset($this->$n);

}

public function say(){

echo "name :".$this->name."<br />";

echo "age :".$this->age;

}

}

$a=new Person("atherse",13);

$a->name="lineagerl";

$a->age=123;

var_dump(isset($a->id));

?>

8. __unset();

官方解释:

public void __unset ( string $name )

当对未定义的变量调用 unset()时,__unset() 会被调用。

备注:

对于需要unset的变量,能使用此方法来间接的unset变量。

例子:

<?php

class Person{

private $name;

private $age;

function __construct($name="",$age=""){

$this->name=$name;

$this->age=$age;

}

private function __set($n,$v){

$this->$n=$v;

}

private function __unset($n){

unset($this->$n);

}

public function say(){

echo "name :".$this->name."<br />";

echo "age :".$this->age;

}

}

$a=new Person("atherse",13);

$a->name="lineagerl";

$a->age=123;

unset($a->name);

$a->say();

?>

9.__sleep();

官方解释:

public array __sleep ( void )serialize() 函数会检查是否存在一个魔术方法 __sleep().如果存在,__sleep()方法会先被调用, 然后才执行序列化操作。这个功能可以用于清理对象,并返回一个包含对象中所有应被序列化的变量名称的数组。如果该方法不返回任何内容,则NULL被序列化,并产生 一个E_NOTICE错误。

备注:

注意返回的必须是数组类型

例子:

<?php

class Test {

public $name; //我的秘密不想让人知道

public function __construct($youName) {

$this->name = $youName;

}

public function __sleep() {

$this->name = "this is not a name";

return array("name");

}

}

$test = new Test("this is a name");

echo serialize($test);

?>

11.__toString();

官方解释:

public string __toString ( void )

当把一个函数转换成字符串时,自动调用其中的语句。

备注:

在PHP 5.2.0之前,__toString()方法只有结合使用 echo 或 print时 才能生效。PHP 5.2.0之后,则可以在任何字符串环境生效(例如通过 printf(),使用%s修饰符),但 不能用于非字符串环境(如使用%d修饰符)。从PHP 5.2.0,如果将一个未定义__toString()方法的对象 转换为字符串,会报出一个E_RECOVERABLE_ERROR错误。例子:

<?php

class Test

{

public $str;

public function __construct($fstr)

{

$this->str = $str;

}

public function __toString() {

return $this->str;

}

}

$class = new Test('Hello');

echo $class;

?>

12. __invoke();

官方解释:

mixed __invoke ([ $... ] )

当尝试以调用函数的方式调用一个对象时,__invoke() 方法会被自动调用。

备注:

本特性只在PHP 5.3.0 及以上版本有效。!!!!

例子:

class CallableClass

{

function __invoke($x) {

var_dump($x);

}

}

$obj = new CallableClass;

$obj(5);

var_dump(is_callable($obj));

13. __set_state();

官方解释:

static object __set_state ( array $properties )

当调用 var_export()时,这个静态方法会被调用(自PHP 5.1.0起有效)。

本方法的唯一参数是一个数组,其中包含按array('property' => value, ...)格式排列的类属性。

备注:无

例子:

<?php

class A

{

public $var1;

public $var2;

public static function __set_state($an_array) // As of PHP 5.1.0

{

$obj = new A;

$obj->var1 = $an_array['var1'];

$obj->var2 = $an_array['var2'];

return $obj;

}

}

$a = new A;

$a->var1 = 5;

$a->var2 = 'foo';

eval('$b = ' . var_export($a, true) . ';'); // $b = A::__set_state(array(

// 'var1' => 5,

// 'var2' => 'foo',

// ));

var_dump($b);

?>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: