- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在学习魔术方法,阅读每个站点,举每个例子,但对我来说没有任何意义。像这样的例子:
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.
比较两者:
var_dump($a)
object(A)#1 (2) { ["var1"]=> int(5) ["var2"]=> string(3) "foo"}
var_export($a)
A::__set_state(array( 'var1' => 5, 'var2' => 'foo', ))
(奖励)序列化($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/
我正在学习魔术方法,阅读每个站点,举每个例子,但对我来说没有任何意义。像这样的例子: class A { public $var1; public $var2; public
我尝试了所有方法来解决这个问题,比如清除缓存、composer 更新/安装,但是在 php artisan config:cache 之后,它又出现了。 In config.php line 839:
__set_state() 是否有一个与 __get_state() 相反的 PHP 函数?我的意思不是 __sleep() 用于序列化。我想要一个简单的函数,它在对象上调用 var_export()
我的代码在生产环境中运行 php artisan config:clear 在那之后,我的代码没有运行。索引页面和所有其他页面都变成了白屏,并在 Firebug 中给出了 500 个内部服务器错误。当
我是一名优秀的程序员,十分优秀!