PHP中如何使用魔术常量(php,编程语言)

时间:2024-04-29 01:07:44 作者 : 石家庄SEO 分类 : 编程语言
  • TAG :

    PHP%E4%B8%AD%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%E9%AD%94%E6%9C%AF%E5%B8%B8%E9%87%8F

  PHP魔术方法有哪些

  __construct(),类的构造函数__destruct(),类的析构函数__call(),在对象中调用一个不可访问方法时调用__callStatic(),用静态方式中调用一个不可访问方法时调用__get(),获得一个类的成员变量时调用__set(),设置一个类的成员变量时调用__isset(),当对不可访问属性调用isset()或empty()时调用__unset(),当对不可访问属性调用unset()时被调用。__sleep(),执行serialize()时,先会调用这个函数__wakeup(),执行unserialize()时,先会调用这个函数__toString(),类被当成字符串时的回应方法__invoke(),调用函数的方式调用一个对象时的回应方法__set_state(),调用var_export()导出类时,此静态方法会被调用。__clone(),当对象复制完成时调用

  __construct()和__destruct()

  构造函数和析构函数应该不陌生,他们在对象创建和消亡时被调用。例如我们需要打开一个文件,在对象创建时打开,对象消亡时关闭

  classFileRead

  {

  protected$handle=NULL;

  function__construct(){

  $this->handle=fopen(...);

  }

  function__destruct(){

  fclose($this->handle);

  }

  }

  >

  这两个方法在继承时可以扩展,例如:

  classTmpFileReadextendsFileRead

  {

  function__construct(){

  parent::__construct();

  }

  function__destruct(){

  parent::__destruct();

  }

  }

  >

  __call()和__callStatic()

  在对象中调用一个不可访问方法时会调用这两个方法,后者为静态方法。这两个方法我们在可变方法(Variablefunctions)调用中可能会用到。

  classMethodTest

  {

  publicfunction__call($name,$arguments){

  echo"Callingobjectmethod'$name'".implode(',',$arguments)."\n";

  }

  publicstaticfunction__callStatic($name,$arguments){

  echo"Callingstaticmethod'$name'".implode(',',$arguments)."\n";

  }

  }

  $obj=newMethodTest;

  $obj->runTest('inobjectcontext');

  MethodTest::runTest('instaticcontext');

  >

  __get(),__set(),__isset()和__unset()

  当get/set一个类的成员变量时调用这两个函数。例如我们将对象变量保存在另外一个数组中,而不是对象本身的成员变量

  classMethodTest

  {

  private$data=array();

  publicfunction__set($name,$value){

  $this->data[$name]=$value;

  }

  publicfunction__get($name){

  if(array_key_exists($name,$this->data))

  return$this->data[$name];

  returnNULL;

  }

  publicfunction__isset($name){

  returnisset($this->data[$name])

  }

  publicfunctionunset($name){

  unset($this->data[$name]);

  }

  }

  >

  __sleep()和__wakeup()

  当我们在执行serialize()和unserialize()时,会先调用这两个函数。例如我们在序列化一个对象时,这个对象有一个数据库链接,想要在反序列化中恢复链接状态,则可以通过重构这两个函数来实现链接的恢复。例子如下:

  classConnection

  {

  protected$link;

  private$server,$username,$password,$db;

  publicfunction__construct($server,$username,$password,$db)

  {

  $this->server=$server;

  $this->username=$username;

  $this->password=$password;

  $this->db=$db;

  $this->connect();

  }

  privatefunctionconnect()

  {

  $this->link=mysql_connect($this->server,$this->username,$this->password);

  mysql_select_db($this->db,$this->link);

  }

  publicfunction__sleep()

  {

  returnarray('server','username','password','db');

  }

  publicfunction__wakeup()

  {

  $this->connect();

  }

  }

  >

  __toString()

  对象当成字符串时的回应方法。例如使用echo$obj;来输出一个对象

  //Declareasimpleclass

  classTestClass

  {

  publicfunction__toString(){

  return'thisisaobject';

  }

  }

  $class=newTestClass();

  echo$class;

  >

  这个方法只能返回字符串,而且不可以在这个方法中抛出异常,否则会出现致命错误。

  __invoke()

  调用函数的方式调用一个对象时的回应方法。如下

  classCallableClass

  {

  function__invoke(){

  echo'thisisaobject';

  }

  }

  $obj=newCallableClass;

  var_dump(is_callable($obj));

  >

  __set_state()

  调用var_export()导出类时,此静态方法会被调用。

  classA

  {

  public$var1;

  public$var2;

  publicstaticfunction__set_state($an_array){

  $obj=newA;

  $obj->var1=$an_array['var1'];

  $obj->var2=$an_array['var2'];

  return$obj;

  }

  }

  $a=newA;

  $a->var1=5;

  $a->var2='foo';

  var_dump(var_export($a));

  >

  __clone()

  当对象复制完成时调用。例如在设计模式详解及PHP实现:单例模式一文中提到的单例模式实现方式,利用这个函数来防止对象被克隆。

  publicclassSingleton{

  privatestatic$_instance=NULL;

  //私有构造方法

  privatefunction__construct(){}

  publicstaticfunctiongetInstance(){

  if(is_null(self::$_instance)){

  self::$_instance=newSingleton();

  }

  returnself::$_instance;

  }

  //防止克隆实例

  publicfunction__clone(){

  die('Cloneisnotallowed.'.E_USER_ERROR);

  }

  }

  >

  PHP魔术常量怎么使用

  PHP中的常量大部分都是不变的,但是有8个常量会随着他们所在代码位置的变化而变化,这8个常量被称为魔术常量。

  __LINE__,文件中的当前行号__FILE__,文件的完整路径和文件名__DIR__,文件所在的目录__FUNCTION__,函数名称__CLASS__,类的名称__TRAIT__,Trait的名字__METHOD__,类的方法名__NAMESPACE__,当前命名空间的名称

  这些魔术常量常常被用于获得当前环境信息或者记录日志。

本文:PHP中如何使用魔术常量的详细内容,希望对您有所帮助,信息来源于网络。
上一篇:PHP中autoload自动加载机制使用方法有哪些以及原理是什么下一篇:

6 人围观 / 0 条评论 ↓快速评论↓

(必须)

(必须,保密)

阿狸1 阿狸2 阿狸3 阿狸4 阿狸5 阿狸6 阿狸7 阿狸8 阿狸9 阿狸10 阿狸11 阿狸12 阿狸13 阿狸14 阿狸15 阿狸16 阿狸17 阿狸18