PHP中如何使用魔术常量
创始人
2024-12-19 06:22:51
0次

  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__,当前命名空间的名称

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

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...