Php 标记类字段
我正在寻找一种方法来标记一个字段,然后将该标记用于对象上的不同操作 例如,序列化没有标记字段的对象:Php 标记类字段,php,reflection,Php,Reflection,我正在寻找一种方法来标记一个字段,然后将该标记用于对象上的不同操作 例如,序列化没有标记字段的对象: class A(){ public $field1; //@dont_serialize public $field2; } $obj = new A(); $obj->field1 = "important data"; $obj->field2 = "not important data"; function MySerialize($obj){ $
class A(){
public $field1;
//@dont_serialize
public $field2;
}
$obj = new A();
$obj->field1 = "important data";
$obj->field2 = "not important data";
function MySerialize($obj){
$arr = (array) $obj;
$new_arr = array();
foreach ($arr as $key => $value) {
if (THIS FEILD IS NOT MARKED AS @dont_serialize)
{
$new_arr[$key] = $value
}
}
return serialize($new_arr);
}
如何实现不会序列化标记字段的MySerialize()。您需要阅读注释并对其进行处理,下面的答案就是一个很好的例子:
还有一个docblock解析器:要继续使用反射API,您应该用“适当”(格式化)注释“标记”字段
下面是使用
ReflectionClass
类、ReflectionProperty::getDocComment
、ReflectionProperty::getName
和ReflectionProperty::getValue
方法的工作解决方案:
class A {
public $field1;
public $field2;
/**
* @dont_serialize
*/
public $field3;
}
$obj = new A();
$obj->field1 = "important data";
$obj->field2 = "needed data";
$obj->field3 = "not important data";
function MySerialize($obj) {
$reflector = new ReflectionClass(get_class($obj));
$props = $reflector->getProperties();
$new_arr = [];
foreach ($props as $property) {
if (strpos($property->getDocComment(), "@dont_serialize") === false) {
$new_arr[$property->getName()] = $property->getValue($obj);
}
}
return serialize($new_arr);
}
print_r(MySerialize($obj));
输出:
"a:2:{s:6:"field1";s:14:"important data";s:6:"field2";s:11:"needed data";}"
仅出于序列化目的,有一种更好的方法,而不是标记属性并使用反射 有,神奇的函数_sleep(),_wakeup()。。。允许更改将使用serialize()函数序列化的字段以获取详细信息请参见 如果没有反射(这将是一个严重的攻击),您可能希望构建一个字段数组来序列化或不序列化。