/** * Declares a class * * @param string $name the name (empty for anonymous classes) * @param array $modifiers an array of modifiers (public, protected, abstract, final, ...) as keys * @param string $extends the class-name of the super-class or empty * @param array $implements an array of implemented interface-names * @param array $stmts an array of statements from the class-body */ public function declare_class($name, $modifiers, $extends, $implements, $stmts) { $class = new PC_Obj_Class($this->get_file(), $this->get_last_class_line()); if ($name == '') { $class->set_anonymous(true); // anonymous classes are always non-abstract and final $class->set_abstract(false); $class->set_final(true); $class->set_name(PC_Obj_Method::ANON_PREFIX . $this->anon_id++); } else { $class->set_abstract(isset($modifiers['abstract'])); $class->set_final(isset($modifiers['final'])); $class->set_name($name); } $class->set_super_class($extends ? $extends : null); foreach ($implements as $if) { $class->add_interface($if); } $this->handle_class_stmts($class, $stmts); $this->env->get_types()->add_classes(array($class)); }