Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/284.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_Magic Methods - Fatal编程技术网

PHP魔法获取和设置。动态创建的字段是否被视为;“无障碍”吗;?

PHP魔法获取和设置。动态创建的字段是否被视为;“无障碍”吗;?,php,magic-methods,Php,Magic Methods,我对PHP的OO系统和一些小怪癖有些陌生。从我所读到的内容来看,当您访问一个不“可访问”的字段时,会调用_get和_set方法。因此,访问类中的公共字段或受保护字段显然不会调用这些函数。但是,如果我尝试访问$obj->a,并且a以前从未定义过,该怎么办?我原本以为这会叫uuu get或uuu set,但似乎不是。我知道解决这个问题的方法是将所有动态创建的字段放入一个数据数组中 $obj->a因此是公共字段吗?多谢各位 范例 class Example { public funct

我对PHP的OO系统和一些小怪癖有些陌生。从我所读到的内容来看,当您访问一个不“可访问”的字段时,会调用_get和_set方法。因此,访问类中的公共字段或受保护字段显然不会调用这些函数。但是,如果我尝试访问$obj->a,并且a以前从未定义过,该怎么办?我原本以为这会叫uuu get或uuu set,但似乎不是。我知道解决这个问题的方法是将所有动态创建的字段放入一个数据数组中


$obj->a因此是公共字段吗?多谢各位

范例

  class Example
  {
    public function __get($field)
    {
      echo 'Getting ' . $field;
      return $this->$field; 
    }

    public function __set($field, $value)
    {
      echo 'Setting ' . $field . ' to ' . $value;
      $this->$field = $value;
    }
   }

   $obj = new Example;
   $obj->randomField = 1; //here randomField is set to 1 but the echo statement is not printed out in __set
   echo $obj->randomField;  //here, 1 will be echoed but not the statement in __get

   //is randomField a public field?

\u集合
中的回音将被打印出来,问题是什么?“$obj->a因此是公共字段吗?”是的,正如您的示例所示……根据经验,我知道“动态”属性具有公共可见性,但是我搜索了一个PHP手册引用,上面说so.so\uu get和u\u set是为已经定义的受保护和私有字段调用的吗?
$obj = new Example;
$obj->randomField = 1; // here __set method is called
echo $obj->randomField; // here __get method won't be called because `$obj->randomField` exists.

//is randomField a public field?
// Yes, after you set it, it became a public field of the object.