php5魔幻变量和魔幻方法

魔术常量
  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。__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)初识魔术方法
  Php5.0发布以来为我们提供了很多面向对象的特性,尤其是为我们提供了好多易用的魔术方法,这些魔术方法可以让我们简化我们的编码,更好的设计我们的系统。今天我们就来认识下php5.0给我们提供的魔术方法。
PHP | 魔术方法 | __toString(),__clone(),__call(),__autoload() 详解
__toString()
如果我有一个类:
class Person
{
private $name = “”;
private $age = 0;
function __construct($name = “”, $age = “”)
{
$this->name = $name;
$this->age = $age;
}
function say()
{
echo “name:”.$this->name.”<br/>”.”age:”.$this->age.”<br/>”;   
}
}
现在我去实例化这个类,然后去打印这个实例:
$p1 = new person(“liuzy”,20);
echo $p1;  //直接打印会出错
显然这样直接打印对象是会出现错误的,因为对象是引用句柄,不能直接打印。这时,我们可以用到__toString()方法。我们在Person类里加一个__toString()方法:
function __toString()
{
return “I am  Person,my name is “.$this->name.”<br/>”;
}
然后再刷新页面,发现什么了?
现在我们明白,__toString()是在直接打印对象时执行的方法,我们可以用该方法打印类的一些相关信息。注意:是两个下划线,方法必须有返回值。
__clone()
我们知道对象是可以直接赋值的,比如
$p2 = $p1;   //这里是一个对象有两个引用
那么我执行:
$p1->say();
$p2->say();
是都可以执行的,而且效果一样。
我们还有一种方法:
$p3 = clone $p1;     //注意clone是克隆关键字,这里与上面的不同是$p3是一个新的对象。
同时我们在类里加入一个方法:
function __clone()
{
$this->name = “我是副本”;  //注意:这里的$this是克隆产生的对象本身,不是当前类
}
然后我们执行:
$p3->say();
打印出:
name:我是副本
age:20
到这里我们明白,__clone()方法是在克隆对象的时候执行的方法,它的作用是对新克隆出来的副本
进行属性初始化等操作。
__call()
这个方法的主要功能是:在该类的实例调用一个不存在的方法时,执行该__call()方法。注意需要提前在类里
声明:
function __call($fname,$argus)
{
echo “你调用的方法:”.$fname.”不存在<br/>”;
echo “参数是”.print_r($argus);
}
声明时包含两个参数,第一个参数是string型,是调用的不存在的方法的方法名($fname),第二个参数是
array型,是调用的不存在的方法的参数($argus)。
__autoload()
我们在平时调用一个类的时候,必须要先将该类所在的文件引入(include “xxx.php”),如果我们在一个页里调用的类很多,那么我们不得不使用许多的include “xxx.php”。显然这样很麻烦。
__autoload()方法可以帮我们解决这个问题。
比如我们将上面的那个Person类所在的文件定义为 Person_class.php  ,
再新建一个php文件  test.php,编辑内容:
function  __autoload($calssName)
{
include $className.”_class.php”;  //看到这也许你就明白了吧?哈哈
}
$p = new Person(“mifan”, 22);
$p->say();
这样执行该test.php页面就不会出现错误了。
__autoload()方法是在生命不存在的类时调用的方法,它有一个string类型的参数是声明该不存在类的类名。

当然,类文件的命名也是很有讲究的。最好是和类有关系,比如Person_class.php

__get和__set使用例子

class Tab{
    protected $arr_data = array();
    function __get($key){
        echo "__get is called,key=$key\n";
        if(isset($this->arr_data[$key])){
            return $this->arr_data[$key];
        }   
        else{
            return null;
        }   
    }   
    function __set($key,$val){
        echo "__set is called,key=$key,val=$val\n";
        $this->arr_data[$key]=$val;
    }   
}

$t = new Tab();

//设置Tab对象me成员的值为"joke",由于Tab对象不含me成员,所以会调用__set($key,$val)方法
$t->me = "joke";

//获取Tab对象me成员的值,由于Tab对象不含me成员,所以会调用__get($key)方法
$e = $t->me;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值