51工具盒子

依楼听风雨
笑看云卷云舒,淡观潮起潮落

基于PHP5魔术常量与魔术方法的详解

本篇文章是对PHP5中的魔术常量与魔术方法进行了详细的分析介绍.

魔术常量:

1。 __LINE__

返回文件中的当前行号。

2。 __FILE__
  返回文件的完整路径和文件名。如果用在包含文件中,则返回包含文件名。自PHP4.0.2 起,__FILE__总是包含一个绝对路径,而在此之前的版本有时会包含一个相对路径。

3。__FUNCTION__
  返回函数名称(PHP4.3.0 新加)。自PHP5 起本常量返回该函数被定义时的名字(区分大小写)。在PHP4 中该值总是小写字母的。

4。__CLASS__
  返回类的名称(PHP4.3.0 新加)。自PHP5 起本常量返回该类被定义时的名字(区分大小写)。在PHP4 中该值总是小写字母的。

5。__METHOD__
  返回类的方法名(PHP5.0.0 新加)。返回该方法被定义时的名字(区分大小写)。

魔术函数:

1。__construct()
  构造函数: 实例化对象时被调用,
  当__construct和以类名为函数名的构造函数同时存在时,__construct将被调用,另一个不被调用。

4。__get()
  读取一个对象的属性时,若属性存在,则直接返回属性值;若不存在,则会调用__get函数。

5。__set()
  设置一个对象的属性时,
  若属性存在,则直接赋值;
  若不存在,则会调用__set函数。

6。__toString()
  打印一个对象的时被调用。如echo$obj;或print$obj;

7。__clone()
  克隆对象时被调用。如:$t=newTest();$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()
  实例化一个对象时,如果对应的类不存在,则该方法被调用。

初识魔术方法

Php5.0发布以来为我们提供了很多面向对象的特性,尤其是为我们提供了好多易用的魔术方法,这些魔术方法可以让我们简化我们的编码,更好的设计我们的系统。今天我们就来认识下php5.0给我们提供的魔术方法。

PHP| 魔术方法|__toString(),__clone(),__call(),__autoload() 详解

__toString()

如果我有一个类:

classPerson {
  private $name = "";
  private $age = 0;
  function __construct($name = "", $age = "") {
    $this->name =$name;
    $this->age = $age;
  }

  functionsay() {
    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);
}

__callStatic (PHP 5.3.0+)

这个方法的主要功能是:在该静态类的调用一个不存在的方法时,执行该__callStatic()方法

 public static function __callStatic($name, $arguments) {
   // 注意: $name 的值区分大小写
   echo "Calling static method '$name' " . implode(', ', $arguments). "n";
 }

__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

PS: __autoload()这种加载类的方式 , 内部是工厂模式加载,不是简单的include, 也不要去搜索文件,而是根据namespace判断路径, 否者就滥用了,效率反而低. 路径 、命令空间都要有点考就才行的. 在没有namespace的php版本(php5.3之前)这就是个鸡肋魔术方法。 标签: 区分大小写,sleep,文章,魔术,字母

赞(2)
未经允许不得转载:工具盒子 » 基于PHP5魔术常量与魔术方法的详解