php魔术方法有哪些及怎么使用
导读:本文共10291.5字符,通常情况下阅读需要34分钟。同时您也可以点击右侧朗读,来听本文内容。按键盘←(左) →(右) 方向键可以翻页。
摘要:<br>\n";}}$Person=newPerson();$Person->run("teacher");//Ifthemethodwhichisnotexistediscalledwithintheobject,thenthecall()methodwillbecalledautomatically.$Person->eat(&q... ...
目录
(为您整理了一些要点),点击可以直达。显示结果
当在程序中调用未定义的静态方法,callStatic()
方法将会被自动调用。
callStatic()
的用法类似于 __call()
。下面举个例子:
执行结果如下:
当你尝试在外部访问对象的私有属性时,应用程序将抛出异常并结束运行。我们可以使用 __get
方法解决该问题。该方法可以获取从对象外部获取私有属性的值。举例如下
结果显示如下
set($property,$value)方法用于设置类的私有属性。分配了未定义的属性后,将触发set()方法,并且传递的参数是设置的属性名称和值。
下面是演示代码:
代码运行结果:
MynameisLili,I'm16yearsold
在使用isset()方法之前,让我先解释一下isset()方法的用法。isset()方法主要用于确定是否设置了此变量。
如果在对象外部使用isset()方法,则有两种情况:
如果该参数是公共属性,则可以使用isset()方法确定是否设置了该属性。
如果参数是私有属性,则isset()方法将不起作用。
那么对于私有属性,有什么办法知道它是否被设置了吗?当然,只要在类中定义isset()方法,就可以在类外部使用isset()方法来确定是否设置了私有属性。
当在未定义或不可访问的属性上调用isset()或empty()时,将调用__isset()方法。下面是一个例子:
代码运行结果如下:
与isset()方法类似,当在未定义或不可访问的属性上调用unset()方法时,将调用unset()方法。下面是一个例子:
代码的运行结果如下:
serialize()方法将检查类中是否有魔术方法sleep()。如果存在,将首先调用该方法,然后执行序列化操作。
__sleep()方法通常用于指定保存数据之前需要序列化的属性。如果有一些非常大的对象不需要全部保存,那么您会发现此功能非常有用。
有关详细信息,请参考以下代码:
代码运行结果如下:
与sleep()方法相比,wakeup()方法通常用于反序列化操作,例如重建数据库连接或执行其他初始化操作。
下面是相关实例:
代码运行结果如下:
使用echo方法直接打印对象时,将调用toString()方法。
注意:此方法必须返回一个字符串,否则将在E_RECOVERABLE_ERROR
级别上引发致命错误。而且您也不能在__toString()方法中抛出异常。
下面是相关的实例:
运行代码结果如下:
gogogo
那么,如果在类中未定义__toString()方法怎么办?让我们尝试一下。
}
运行代码结果如下:
Catchablefatalerror:ObjectofclassPersoncouldnotbeconvertedtostringinD:\phpStudy\WWW\test\index.phponline18
显然,它在页面上报告了一个致命错误,PHP语法不支持这样的写法。
当您尝试以调用函数的方式调用对象时, invoke()方法将被自动调用。
注意:此功能仅在PHP 5.3.0及更高版本中有效。
下面是相关实例:
}
运行代码结果如下:
Thisisanobject
如果坚持使用对象作为方法(但未定义invoke()方法),则将得到以下结果:
Fatalerror:FunctionnamemustbeastringinD:\phpStudy\WWW\test\index.phponline18
从PHP 5.1.0开始,在调用var_export()导出类代码时会自动调用set_state()方法。
__set_state()方法的参数是一个包含所有属性值的数组,其格式为array('property'=> value,...)
在以下示例中,我们没有定义set_state()方法:
}
执行代码结果如下:
Person::__set_state(array('sex'=>'Male','name'=>'John','age'=>25,))
显然,对象的属性已打印。
现在让我们看看定义__set_state()方法的另一种情况:
}
执行代码结果如下:
Person::__set_state(array('sex'=>'Male','name'=>'Jams','age'=>25,))
在PHP中,我们可以使用clone关键字通过以下语法克隆对象:
$copy_of_object=clone$object;
但是,使用clone关键字只是一个浅拷贝,因为所有引用的属性仍将指向原始变量。
如果在对象中定义了clone()方法,则将在复制生成的对象中调用clone()方法,该方法可用于修改属性的值(如有必要)。
下面是相关的示例:
}
运行代码结果如下:
__autoload()方法可以尝试加载未定义的类。
过去,如果要在程序文件中创建100个对象,则必须使用include()或require()来包含100个类文件,或者必须在同一类文件中定义100个类。 例如以下:
那么,如果我们使用__autoload()方法呢?
当PHP引擎第一次使用类A时,如果未找到类A,则autoload方法将被自动调用,并且类名称“ A”将作为参数传递。因此,我们在autoload()方法中需要做的是根据类名找到相应的类文件,然后将其包含在内。如果找不到该文件,则php引擎将抛出异常。
当执行 var_dump()
方法时,debugInfo()
方法会被自动调用。如果 debugInfo()
方法未被定义,那么 var_dump
方法或打印出这个对象的所有属性。
举例说明:
var_dump(newC(42));
执行结果:
object(C)#1(1){["propSquared"]=>int(1764)}
注意:__debugInfo() 方法应该在 PHP 5.6.0 及以上版本中使用。
php魔术方法有哪些及怎么使用的详细内容,希望对您有所帮助,信息来源于网络。