189 8069 5689

PHP中如何使用魔术常量

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


当前名称:PHP中如何使用魔术常量
转载来源:http://cdxtjz.cn/article/pcjcos.html

其他资讯