1: <?php declare(strict_types=1);
2:
3: namespace PhpParser\Node\Stmt;
4:
5: use PhpParser\Modifiers;
6: use PhpParser\Node;
7:
8: class Class_ extends ClassLike {
9: /** @deprecated Use Modifiers::PUBLIC instead */
10: public const MODIFIER_PUBLIC = 1;
11: /** @deprecated Use Modifiers::PROTECTED instead */
12: public const MODIFIER_PROTECTED = 2;
13: /** @deprecated Use Modifiers::PRIVATE instead */
14: public const MODIFIER_PRIVATE = 4;
15: /** @deprecated Use Modifiers::STATIC instead */
16: public const MODIFIER_STATIC = 8;
17: /** @deprecated Use Modifiers::ABSTRACT instead */
18: public const MODIFIER_ABSTRACT = 16;
19: /** @deprecated Use Modifiers::FINAL instead */
20: public const MODIFIER_FINAL = 32;
21: /** @deprecated Use Modifiers::READONLY instead */
22: public const MODIFIER_READONLY = 64;
23:
24: /** @deprecated Use Modifiers::VISIBILITY_MASK instead */
25: public const VISIBILITY_MODIFIER_MASK = 7; // 1 | 2 | 4
26:
27: /** @var int Modifiers */
28: public int $flags;
29: /** @var null|Node\Name Name of extended class */
30: public ?Node\Name $extends;
31: /** @var Node\Name[] Names of implemented interfaces */
32: public array $implements;
33:
34: /**
35: * Constructs a class node.
36: *
37: * @param string|Node\Identifier|null $name Name
38: * @param array{
39: * flags?: int,
40: * extends?: Node\Name|null,
41: * implements?: Node\Name[],
42: * stmts?: Node\Stmt[],
43: * attrGroups?: Node\AttributeGroup[],
44: * } $subNodes Array of the following optional subnodes:
45: * 'flags' => 0 : Flags
46: * 'extends' => null : Name of extended class
47: * 'implements' => array(): Names of implemented interfaces
48: * 'stmts' => array(): Statements
49: * 'attrGroups' => array(): PHP attribute groups
50: * @param array<string, mixed> $attributes Additional attributes
51: */
52: public function __construct($name, array $subNodes = [], array $attributes = []) {
53: $this->attributes = $attributes;
54: $this->flags = $subNodes['flags'] ?? $subNodes['type'] ?? 0;
55: $this->name = \is_string($name) ? new Node\Identifier($name) : $name;
56: $this->extends = $subNodes['extends'] ?? null;
57: $this->implements = $subNodes['implements'] ?? [];
58: $this->stmts = $subNodes['stmts'] ?? [];
59: $this->attrGroups = $subNodes['attrGroups'] ?? [];
60: }
61:
62: public function getSubNodeNames(): array {
63: return ['attrGroups', 'flags', 'name', 'extends', 'implements', 'stmts'];
64: }
65:
66: /**
67: * Whether the class is explicitly abstract.
68: */
69: public function isAbstract(): bool {
70: return (bool) ($this->flags & Modifiers::ABSTRACT);
71: }
72:
73: /**
74: * Whether the class is final.
75: */
76: public function isFinal(): bool {
77: return (bool) ($this->flags & Modifiers::FINAL);
78: }
79:
80: public function isReadonly(): bool {
81: return (bool) ($this->flags & Modifiers::READONLY);
82: }
83:
84: /**
85: * Whether the class is anonymous.
86: */
87: public function isAnonymous(): bool {
88: return null === $this->name;
89: }
90:
91: public function getType(): string {
92: return 'Stmt_Class';
93: }
94: }
95: