1<?php declare(strict_types=1); 2 3namespace PhpParser\Node\Stmt; 4 5use PhpParser\Modifiers; 6use PhpParser\Node; 7use PhpParser\Node\ComplexType; 8use PhpParser\Node\Identifier; 9use PhpParser\Node\Name; 10use PhpParser\Node\PropertyItem; 11 12class Property extends Node\Stmt { 13 /** @var int Modifiers */ 14 public int $flags; 15 /** @var PropertyItem[] Properties */ 16 public array $props; 17 /** @var null|Identifier|Name|ComplexType Type declaration */ 18 public ?Node $type; 19 /** @var Node\AttributeGroup[] PHP attribute groups */ 20 public array $attrGroups; 21 /** @var Node\PropertyHook[] Property hooks */ 22 public array $hooks; 23 24 /** 25 * Constructs a class property list node. 26 * 27 * @param int $flags Modifiers 28 * @param PropertyItem[] $props Properties 29 * @param array<string, mixed> $attributes Additional attributes 30 * @param null|Identifier|Name|ComplexType $type Type declaration 31 * @param Node\AttributeGroup[] $attrGroups PHP attribute groups 32 * @param Node\PropertyHook[] $hooks Property hooks 33 */ 34 public function __construct(int $flags, array $props, array $attributes = [], ?Node $type = null, array $attrGroups = [], array $hooks = []) { 35 $this->attributes = $attributes; 36 $this->flags = $flags; 37 $this->props = $props; 38 $this->type = $type; 39 $this->attrGroups = $attrGroups; 40 $this->hooks = $hooks; 41 } 42 43 public function getSubNodeNames(): array { 44 return ['attrGroups', 'flags', 'type', 'props', 'hooks']; 45 } 46 47 /** 48 * Whether the property is explicitly or implicitly public. 49 */ 50 public function isPublic(): bool { 51 return ($this->flags & Modifiers::PUBLIC) !== 0 52 || ($this->flags & Modifiers::VISIBILITY_MASK) === 0; 53 } 54 55 /** 56 * Whether the property is protected. 57 */ 58 public function isProtected(): bool { 59 return (bool) ($this->flags & Modifiers::PROTECTED); 60 } 61 62 /** 63 * Whether the property is private. 64 */ 65 public function isPrivate(): bool { 66 return (bool) ($this->flags & Modifiers::PRIVATE); 67 } 68 69 /** 70 * Whether the property is static. 71 */ 72 public function isStatic(): bool { 73 return (bool) ($this->flags & Modifiers::STATIC); 74 } 75 76 /** 77 * Whether the property is readonly. 78 */ 79 public function isReadonly(): bool { 80 return (bool) ($this->flags & Modifiers::READONLY); 81 } 82 83 /** 84 * Whether the property is abstract. 85 */ 86 public function isAbstract(): bool { 87 return (bool) ($this->flags & Modifiers::ABSTRACT); 88 } 89 90 /** 91 * Whether the property is final. 92 */ 93 public function isFinal(): bool { 94 return (bool) ($this->flags & Modifiers::FINAL); 95 } 96 97 /** 98 * Whether the property has explicit public(set) visibility. 99 */ 100 public function isPublicSet(): bool { 101 return (bool) ($this->flags & Modifiers::PUBLIC_SET); 102 } 103 104 /** 105 * Whether the property has explicit protected(set) visibility. 106 */ 107 public function isProtectedSet(): bool { 108 return (bool) ($this->flags & Modifiers::PROTECTED_SET); 109 } 110 111 /** 112 * Whether the property has explicit private(set) visibility. 113 */ 114 public function isPrivateSet(): bool { 115 return (bool) ($this->flags & Modifiers::PRIVATE_SET); 116 } 117 118 public function getType(): string { 119 return 'Stmt_Property'; 120 } 121} 122