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

PHP 魔术方法

2015-12-15 14:55 591 查看
下面我们来看看php魔术方法,首先来看看魔术方法的定义:

PHP 将所有以 (两个下划线)开头的类方法保留为魔术方法。所以在定义类方法时,除了上述魔术方法,建议不要以 为前缀。

下面来看看常见的魔术方法:

__construct(), __destruct(), __call(),

__callStatic() , __get() , __set(),

__isset() , __unset() , __sleep(),

__wakeup() , __toString(), __invoke(),

__set_state(), __clone() , __debugInfo()

__construct()

对于这个魔术方法,在php中我们称之为构造函数;

构造函数的特点:

1:具有构造函数的类会在每次创建新对象时先调用此方法,所以非常适合在使用对象之前做一些初始化工作。

2:Note: 如果子类中定义了构造函数则不会隐式调用其父类的构造函数。要执行父类的构造函数,需要在子类的构造函数中调用 parent::__construct()。如果子类没有定义构造函数则会如同一个普通的类方法一样从父类继承(假如没有被定义为 private 的话)。

3:在 PHP5.0 以上版本里,还兼容了 4.0 版本的构造函数的定义规则。如果同时定义了4.0的构造函数和 __construct()函数,则__construct() 函数优先。

For example:

<?php
/**
* xxx.php
* ==============================================
* Copy right 2012-2015
* ----------------------------------------------
* This is not a free software, without any authorization is not allowed to use and spread.
* ==============================================
* @Author:YeXianMing
* @Email:LangWaiShiGe@hotmail.com
* @Version:zend studio10.6.2 php5.4.38 apache2.2
*/
class student{
private $name;
private $age;
private $sex;

public function __construct($name,$age,$sex){
$this->name=$name;
$this->age=$age;
$this->sex=$sex;
}

public function test(){
return "the student name:".$this->name."<br>age:".$this->age."<br>sex:".$this->sex;
}
}

$S=new student('张三','25','男');
echo $S->test();
?>


__destruct()

对于这个魔术方法,在php中我们称之为析构函数;

构造函数特点:

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

2:和构造函数一样,父类的析构函数不会被引擎暗中调用。要执行父类的析构函数,必须在子类的析构函数体中显式调用 parent::__destruct()。此外也和构造函数一样,子类如果自己没有定义析构函数则会继承父类的。

3:析构函数即使在使用 exit() 终止脚本运行时也会被调用。在析构函数中调用 exit() 将会中止其余关闭操作的运行。

4.PHP将在对象被销毁前(即从内存中清除前)调用这个方法。默认情况下,PHP仅仅释放对象属性所占用的内存并销毁对象相关的资源。析构函数允许你在使用一个对象之后执行任意代码来清除内存。当PHP决定你的脚本不再与对象相关时,析构函数将被调用。在一个函数的命名空间内,这会发生在函数return的时候。

__call()

如果你试着调用一个对象中不存在或被权限控制中的方法,__call 方法将会被自动调用,这个方法实在PHP5中新增的;

下面我们来看看__call()实例:

class Test{
protected $var=array();
public function __call($method,$args){
list($name1,$name2)=explode('_',$method);
if(!in_array($name1,array('set','get'))||$name2==''){
return '';
}

switch($name1){
case 'set':
$this->var[$name2]=$args[0];
break;
case 'get':
return isset($this->var[$name2])?$this->var[$name2]:'';
break;
default:
}
}

}

class User extends Test{
public function show(){
if($this->var){
foreach($this->var as $key=>$value){
echo $key.':'.$value.'<br>';
}
}
}
}

$u=new user();
$u->set_name('Xiaohong');
$u->set_age(24);
$u->show();


output:

name:Xiaohong
age:24


__callStatic()

当调用的静态方法不存在或权限不足时,会自动调用__callStatic方法。如下实例:

class Member{
protected static $memberdata=array();

public static function __callstatic($func,$arguments){
list($type,$name)=explode('_',$func);
if(!in_array($type,array('set','get'))||$name==''){
return '';
}

$feature=get_called_class();
switch($type){
case 'set':
self::$memberdata[$feature][$name]=$arguments[0];
break;

case 'get':
return isset(self::$memberdata[$feature][$name])?self::$memberdata[$feature][$name]:'';
break;

default:
}
}
}

class User extends Member{
public static function show(){
$feature=get_called_class();

if(self::$memberdata[$feature]){
foreach(self::$memberdata[$feature] as $key=>$member){
echo $key.':'.$member.'<br>';
}
}
}
}

class Profession extends Member{
public static function show(){
$feature=get_called_class();
if(self::$memberdata[$feature]){
foreach(self::$memberdata[$feature] as $key=>$value){
echo $key.':'.$value.'<br>';
}
}
}
}

User::set_name('Xiaoming');
User::set_age(25);
User::show();

Profession::set_Profession('hello');
Profession::set_price(23.5);
Profession::show();


output:

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