Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 标记类字段_Php_Reflection - Fatal编程技术网

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()函数序列化的字段以获取详细信息请参见

如果没有反射(这将是一个严重的攻击),您可能希望构建一个字段数组来序列化或不序列化。