百度网站推广怎么做,鞍山做网站比较好的公司,叫别人做网站要给什么东西,广告联盟赚钱平台PHP魔术方法
PHP 中的魔术方法是一组特殊的方法#xff0c;它们在特定情况下自动被调用。这些方法的名称都是以两个下划线#xff08;__#xff09;开头。魔术方法提供了一种方式来执行各种高级编程技巧#xff0c;使得对象的行为可以更加灵活和强大。以下是一…PHP魔术方法
PHP 中的魔术方法是一组特殊的方法它们在特定情况下自动被调用。这些方法的名称都是以两个下划线__开头。魔术方法提供了一种方式来执行各种高级编程技巧使得对象的行为可以更加灵活和强大。以下是一些常见的PHP魔术方法
__construct(): 构造函数当一个新对象被创建时调用。__destruct(): 析构函数当一个对象不再被使用时调用。__call($name, $arguments): 当调用一个对象中不存在的方法时调用。__callStatic($name, $arguments): 当调用一个静态方法不存在时调用。__get($name): 当读取一个不可访问的属性时调用。__set($name, $value): 当设置一个不可访问的属性时调用。__isset($name): 当对不可访问的属性调用 isset() 或 empty() 时调用。__unset($name): 当对不可访问的属性调用 unset() 时调用。__sleep(): 在序列化对象之前调用通常用于清理任务或返回数组中的哪些属性需要被序列化。__wakeup(): 在反序列化对象时调用通常用于重新建立数据库连接或执行其他初始化操作。__toString(): 当对象被当作字符串使用时调用例如在 echo 语句中。__invoke(): 当尝试将对象当作函数调用时执行。__set_state($array): 当调用 var_export() 且返回的结果被执行时调用。__clone(): 当对象被克隆时调用。
这些魔术方法提供了对对象生命周期中各种事件的控制以及对对象行为的定制化。正确和恰当地使用这些方法可以使你的代码更加健壮和灵活
掌握PHP魔术方法分为触发时机---功能---参数--返回值
最低要求起码知道触发时机不然对之后pop链的学习影响会很大
很感谢陈腾老师的教导
接下来我会带领大家一一学习PHP魔术方法
接下来都会是代码加解释的形式和大家一起·学习
1.——construct
?phphighlight_file(__FILE__);class User { public $username; public function __construct($username) { $this-username $username; echo 触发了构造函数1次 ; }}$test new User(benben);$ser serialize($test);unserialize($ser);?输出触发了构造函数1次
这里是先定义一个类User下面的public是全局变量的意思这里提一下如果使用的是private那就是属于一个私有属性也就是说你只能在User这个类里面使用如果你在外面调用了它肯定是不行的。接下来public function __construct($username) { $this-username $username; echo 触发了构造函数1次 ; }这里就是一个魔术方法
换句话来说就是user这个类里面有username和一个魔术方法后面的代码就是调用user这个类里面的属性而已
搞懂了代码就好说了$test new User(benben);这里是实例化对象所以只会在这行代码触发输出“触发了构造函数1次”
这个__construct()魔术方法很简单
触发时机实例化对象时会触发比如$test new User(benben);)这里就时实例化对象
功能就是提前清理不必要的内容
参数非必要
返回值 2.__destruct()
在对象的所有的引用被删除或者当对象被显示销毁时执行的魔术方法
比如?phphighlight_file(__FILE__);class User { public function __destruct() { echo 触发了析构函数1次.br / ; }}$test new User(benben);$ser serialize($test);unserialize($ser);?触发了析构函数1次 触发了析构函数1次
__destruct()
触发时机对象引用完成或对象被销毁反序列化之后
功能
参数
返回值 来到题目 ?php highlight_file(__FILE__);error_reporting(0); class User { var $cmd echo dazhuang666!!; ; public function __destruct() { eval ($this-cmd); } }$ser $_GET[benben];unserialize($ser);
拿到这道题目就直接徒手构造就好了benbenO:4:User:1:{s:3:cmd;s:13:system(id);;}
首先是objectUser对应的是四个字符里面只有1个成员属性最后的“;”不要忘记。
直接拿下这里直接反序列化的时候就已经触发了——dstruct() 3._sleep() 触发时机_slee[()先执行序列化之后再执行也就是序列化前调用
功能
参数
返回值
?phphighlight_file(__FILE__);class User { const SITE uusama; public $username; public $nickname; private $password; public function __construct($username, $nickname, $password) { $this-username $username; $this-nickname $nickname; $this-password $password; } public function __sleep() { return array(username, nickname); }}$user new User(a, b, c);echo serialize($user);?O:4:User:2:{s:8:username;s:1:a;s:8:nickname;s:1:b;}
这串代码的意思是一个对象user还有它的对应属性。
接下来直接_construct魔术方法,因为最下面new User会触发
这个魔术方法但是后面的sleep遇到serialize又会触发魔术方法_sleep()这里先触发——construct()在实例化前触发并且把usernamenicknamepassword为别赋值a,b,c
这里本来应该输出的是三个参数的但是后面的sleep又触发魔术方法结果password就不输出 4._wakeup()
这个在做反序列化unserialize之前触发
触发时机这个在做反序列化unserialize之前触发
功能
参数
返回值返回void
?php highlight_file(__FILE__);error_reporting(0); class User { const SITE uusama; public $username; public $nickname; private $password; private $order; public function __wakeup() { system($this-username); } }$user_ser $_GET[benben];unserialize($user_ser);?
?benbenO:4:”User”:1:{s:8:”username”;s:2:”id”;}
这里构造1个就好因为_wakeup()过后就只调用username其他几个属性就没有必要写了
Ps反序列化里面对字符串包裹就只能使用双引号单引号不识别 5._tostring() 触发时机把对象被当成字符串调用
功能
参数
返回值
?phphighlight_file(__FILE__);error_reporting(0);class User { var $benben this is test!!; public function __toString() { return 格式不对输出不了!; }}$test new User() ;print_r($test);echo br /;echo $test;?User Object ( [benben] this is test!! )格式不对输出不了!(这个命令是 $test)所触发的
把类User实例化并且赋值给$test,此时的$test是个对象调用对象可以使用print_
或者是var_dump
但是如果使用echo或者print只能调用字符串的方式去调用对象即把对象当成字符串使用此时自动触发tostring()
也就是说后面的echo $test直接当成字符串输出了这里会触发魔术方法tostring()
6._invoke() 触发时机把对象被当成函数调用
功能
参数
返回值
?phphighlight_file(__FILE__);error_reporting(0);class User { var $benben this is test!!; public function __invoke() { echo 它不是个函数!; }}$test new User() ;echo $test -benben;echo br /;echo $test() -benben;?this is test!!它不是个函数!
其实跟tostring差不多就是echo $test() -benben这里直接把它当成函数输出导致了魔术方法触发 7._call()
触发时机调用了一个根本不存在的方法
功能
参数2个参数$arg1,$arg2
返回值调用的不存在的方法的名称和参数
?phphighlight_file(__FILE__);error_reporting(0);class User { public function __call($arg1,$arg2) { echo $arg1,$arg2[0]; }}$test new User() ;$test - callxxx(a);?输出callxxx,a
$test new User()这句话是把new User实例化成为一个对象给$test接下来从test调用出来一个方法callxxx并且给他传了个参数是a但是这里根本没有callxxx所以做不到这里就触发了魔术方法
$arg1是方法$arg2是参数 8._callstatic() 触发时机静态调用或调用成员常量时使用
功能
参数2个参数$arg1,$arg2
返回值调用的不存在的方法的名称和参数
?phphighlight_file(__FILE__);error_reporting(0);class User { public function __callStatic($arg1,$arg2) { echo $arg1,$arg2[0]; }}$test new User() ;$test::callxxx(a);?callxxx,a
这里跟_call()差不多一样的只不过这个是静态调用比如$test::callxxx(a);时使用而已不是静态调用就不会触发你可以把::改一下看看别的还会不会触发
9.__get()
触发时机调用的成员属性不存在
功能
参数
返回值不存在的成员属性的名称
?php highlight_file(__FILE__); error_reporting(0); class User { public $var1; public function __get($arg1) { echo $arg1; } } $test new User() ; $test -var2; ? 输出 var2
这里其实就是少了一个参数var2但是$test -var2;这里却要输出var2所以就会触发get魔术方法自动帮你添加一个var2上去
10._set()
触发时机给不存在的成员属性赋值
功能
参数
返回值不存在的成员属性的名称和赋的值
?php highlight_file(__FILE__); error_reporting(0); class User { public $var1; public function __set($arg1 ,$arg2) { echo $arg1.,.$arg2; } } $test new User() ; $test -var21; ? 输出 var2,1
11._isset()
对一个被保护的属性或者根本就不存在的属性或者私有属性
触发时机对不可访问属性使用isset或empty时__isset就会被调用
功能
参数
返回值不存在的成员属性的名称
?phphighlight_file(__FILE__);error_reporting(0);class User { private $var; public function __isset($arg1 ) { echo $arg1; }}$test new User() ;isset($test-var);? 输出var
比如这段代码因为这里的var只能在当前类中使用因为这是一个私有属性你出来后调用肯定不可以这里一定会触发——isset魔术方法最终顺利输出var
12._unset() 触发时机对不可访问属性使用__unset时
功能
参数
返回值不存在的成员属性的名称
?php highlight_file(__FILE__); error_reporting(0); class User { private $var; public function __unset($arg1 ) { echo $arg1; } } $test new User() ; unset($test-var); ? 输出 var 13._clone()
触发时机使用clone关键字拷贝完成一个对象后新对象会自动调用定义的魔术方法__clone()
就是说使用clone克隆对象完成后就会触发魔术方法__clone()
功能
参数
返回值
?php highlight_file(__FILE__); error_reporting(0); class User { private $var; public function __clone( ) { echo __clone test; } } $test new User() ; $newclass clone($test) ?
输出 __clone test
真心希望我的文章能够让大家有所收获 总结