/** * Creates class fields. * * @param array $vars an array of PC_Obj_Variable's * @param array $modifiers an array with modifiers * @return array an array of PC_Obj_Field */ public function create_fields($vars, $modifiers) { $res = array(); $base = new PC_Obj_Field($this->get_file(), $this->get_line(), $vars[0]['name']); $base->set_static(in_array('static', $modifiers)); if (in_array('private', $modifiers)) { $base->set_visibility(PC_Obj_Visible::V_PRIVATE); } else { if (in_array('protected', $modifiers)) { $base->set_visibility(PC_Obj_Visible::V_PROTECTED); } else { $base->set_visibility(PC_Obj_Visible::V_PUBLIC); } } $this->parse_field_doc($base); foreach ($vars as $v) { $field = clone $base; $field->set_name($v['name']); if (!$field->get_type()->is_multiple() && isset($v['val'])) { $field->set_type($v['val']); } $res[] = $field; } return $res; }
/** * Parses the given field-description * * @param string $desc the description * @return PC_Obj_Field|PC_Obj_Constant the field or constant * @throws PC_PHPRef_Exception if it fails */ public static function parse_field_desc($desc) { // prepare description $desc = trim(strip_tags($desc)); $desc = FWS_StringHelper::htmlspecialchars_back($desc); // filter out modifier, return-type, name and params $match = array(); $res = preg_match('/^(?:(const|readonly|static|public|protected|private)\\s*)?' . '(?:(const|readonly|static|public|protected|private)\\s*)?' . '(?:(const|readonly|static|public|protected|private)\\s*)?' . '(?:(\\S+)\\s+)?' . '\\$?([a-zA-Z0-9_:]+)\\s*(?:=\\s*([^' . "\n" . ';]+)\\s*)?;$/s', $desc, $match); if (!$res) { throw new PC_PHPRef_Exception('Unable to parse "' . $desc . '"'); } list(, $modifier1, $modifier2, $modifier3, $type, $name) = $match; if ($modifier1 == 'const' || $modifier2 == 'const' || $modifier3 == 'const') { $field = new PC_Obj_Constant('', 0, $name); } else { $field = new PC_Obj_Field('', 0, $name); if ($modifier1 == 'static' || $modifier2 == 'static' || $modifier3 == 'static') { $field->set_static(true); } if (in_array($modifier1, array('private', 'protected'))) { $field->set_visibility($modifier1); } else { if (in_array($modifier2, array('private', 'protected'))) { $field->set_visibility($modifier2); } else { if (in_array($modifier3, array('private', 'protected'))) { $field->set_visibility($modifier3); } } } } if ($type) { $field->set_type(PC_Obj_MultiType::get_type_by_name($type)); } if (isset($match[6]) && $match[6] !== '' && !$field->get_type()->is_multiple()) { if ($type) { $field->get_type()->get_first()->set_value($match[6]); } else { $field->set_type(new PC_Obj_MultiType(PC_Obj_Type::get_type_by_value($match[6]))); } } return $field; }