温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

PHP中如何使用魔术常量

发布时间:2021-06-30 16:32:39 来源:亿速云 阅读:132 作者:Leah 栏目:编程语言

这篇文章将为大家详细讲解有关PHP中如何使用魔术常量,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

  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中如何使用魔术常量就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

php
AI