总结PHP5的魔幻函数

PHP5中引入不少魔幻函数,在PHP中具有特定名称——都是用两个下划线开头的,并且PHP解释器会在运行到某一个时机的时候自动查找并运行的方法。

总结一下:
__construct 初始化 构造函数
__destruct 卸载 析构函数
__autoload 自动加载函数
<?php
class Person {
var $name, $age;
function __construct ($name, $age)
{
   $this->name = $name;
   $this->age = $age;
}
}

function __autoload($classname) {
require_once ($classname . "class.php");
}
$person = new Person("Altair", 6);var_dump ($person);
?>
可参考资料:http://ythzjk.javaeye.com/blog/333628
__call   调用不存在的类的函数的时候得处理方法,__call 失败,就调用父类方法,依此类推

<?php
class Test {
public function __construct() {
   echo "this is test";
}

public function __call($name, $args) {
   echo "$name is not exists";
}
}
$test = new Test();
$test->aaa();
?>

__callStatic(php5.3) 类似__call只是调用方法不同

__get   获取属性值
__set()   设置属性值
__isset() 测定变量是否设定用的函数,传入一个变量作为参数,如果传入的变量存在则传回true,否则传回false
__unset() 删除指定的变量且传回true,参数为要删除的变量。
<?php

class DynamicFoo{

    private $vars = array();

    public function __construct(){

    }

    public function __set($var, $val){
        $this->vars[$var] = $val;
    }

    public function __get($var){
        if(isset($this->vars[$var])){
            return $this->vars[$var];
        } else {
            throw new Exception("Property $var does not exist");
        }
    }

    public function __isset($prop) {
return isset($this->prop);
    }

    public function __unset($prop) {
return unset($this->prop);
    }

}

$dynamicFoo = new DynamicFoo();

$dynamicFoo->hello = "world"; // sets the properly
echo $dynamicFoo->hello; // displays “world”
echo $dynamicFoo->bar; // throws an exception

?>

__clone();   克隆对象
<?php
class Animal
{
   public $name;
   public $legs;

   function setName($name)
   {
$this->name = $name;
   }

   function setLegs($legs)
   {
$this->legs = $legs;
   }
}

$tiger = new Animal();
$tiger->name = "Tiger";
$tiger->legs = 4;

$kangaroo = $tiger;
$kangaroo->name = "Kangaroo";
$kangaroo->legs = 2;

echo $tiger->name."---".$tiger->legs;
echo "<br />".$kangaroo->name."---".$kangaroo->legs;
echo '<hr />';
class Animal2
{
   public $name ;
   public $legs;

   function setName($name)
   {
$this->name = $name;
   }

   function setLegs($legs)
   {
$this->legs = $legs;
   }

   function __clone()
   {
//echo "<br />Object Cloning in Progress";
   }
}

$tiger = new Animal2();
$tiger->name = "Tiger";
$tiger->legs = 4;

$kangaroo = clone $tiger;
$kangaroo->name = "Kangaroo";
$kangaroo->legs = 2;

echo "<br />".$tiger->name."---".$tiger->legs;
echo "<br />".$kangaroo->name."---".$kangaroo->legs;
?>

__toString(); 进行对象的类型转换
<?php
class Test{
public function __construct() {

}
public function __toString() {
   return 'aaaa';
}
}

$test = new Test();
echo $test;
?>
__sleep();    
__wakeup();
当一个对象被串行化,PHP会调用__sleep方法(如果存在的话). 在反串行化一个对象后,PHP 会调用__wakeup方法. 这两个方法都不接受参数. __sleep方法必须返回一个数组,包含需要串行化的属性.

<?php
class Customer {
private $name;
private $credit_card_number;

public function setName($name) {
   $this->name = $name;
}

public function getName() {
   return $this->name;
}

public function setCC($cc) {
   $this->credit_card_number = $cc;
}

public function getCC() {
   return $this->credit_card_number;
}

public function __sleep() {
   return array("name");
}

public function __wakeup() {
   if($this->name == "Sunil") {
    //you would ideally fetch CC data from Database
    $this->credit_card_number = "1234567890123456";
   }
}
}

$c = new Customer();
$c->setName("Sunil");
$c->setCC("1234567890123456");

$data = serialize($c)."\n";
var_dump($data);
var_dump(unserialize($data));
?>

0

这篇文章还没有评论

发表评论