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));
?>
这篇文章还没有评论