gpt4 book ai didi

php - PHP 中魔术方法 __set_state 的真正目的是什么?

转载 作者:可可西里 更新时间:2023-11-01 13:46:45 25 4
gpt4 key购买 nike

我正在学习魔术方法,阅读每个站点,举每个例子,但对我来说没有任何意义。像这样的例子:

class A
{
public $var1;
public $var2;

public static function __set_state($an_array) // As of PHP 5.1.0
{
$obj = new A;
$obj->var1 = $an_array['var1'];
$obj->var2 = $an_array['var2'];
return $obj;
}
}

$a = new A;
$a->var1 = 5;
$a->var2 = 'foo';

eval('$b = ' . var_export($a, true) . ';'); // $b = A::__set_state(array(
// 'var1' => 5,
// 'var2' => 'foo',
// ));
var_dump($b);

真正的目的是什么?是为了调试还是什么?

最佳答案

__set_state 可以结合var_export

来理解

如果您阅读 the docs :

var_export() gets structured information about the given variable. Itis similar to var_dump() with one exception: the returnedrepresentation is valid PHP code.

比较两者:

  1. var_dump($a)

    object(A)#1 (2) { ["var1"]=> int(5) ["var2"]=> string(3) "foo"}

  2. var_export($a)

    A::__set_state(array( 'var1' => 5, 'var2' => 'foo', ))

  3. (奖励)序列化($a)

    O:1:"A":2:{s:4:"var1";i:5;s:4:"var2";s:3:"foo";}

所以第二个是有效的 PHP 代码,您可以运行它并最终得到类似的对象。

那么如果你删除了 __set_state 方法会发生什么?让我们试试:

class A
{
public $var1;
public $var2;
}

$a = new A;
$a->var1 = 5;
$a->var2 = 'foo';

var_export($a);
// A::__set_state(array( 'var1' => 5, 'var2' => 'foo', ))

仍然有效,对吧?那就叫吧

class A
{
public $var1;
public $var2;
}

$a = A::__set_state(array( 'var1' => 5, 'var2' => 'foo', ))
// Exception: Call to undefined method A::__set_state()

让我们把它带回来看看:

class A
{
public $var1;
public $var2;

public static function __set_state($an_array) // As of PHP 5.1.0
{
$obj = new A;
$obj->var1 = $an_array['var1'];
$obj->var2 = $an_array['var2'];
return $obj;
}
}

$a = A::__set_state(array( 'var1' => 5, 'var2' => 'foo', ));
var_dump($a);
// object(A)#1 (2) { ["var1"]=> int(5) ["var2"]=> string(3) "foo" }

所以 __set_state 方法的真正目的是初始化一个对象,以防有人用 var_export“序列化”它。

为什么有人需要它?使用serialize 序列化的对象需要使用unserialize 反序列化。但是通过 var_export 保存在文件中的对象可以被包含,因为它只是一个有效的 PHP 代码。

编辑:

我不会真的称这个方法为magic(即使它在文档中这样描述)因为它没有什么神奇之处。 PHP 只是假设它在 var_export 被调用时存在,如果您想使用生成的任何 var_export,它就必须存在。我会说这只是一个约定,它被称为 __set_state - 那里没有魔法。但这只是我的拙见。

关于php - PHP 中魔术方法 __set_state 的真正目的是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46441958/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com