File tree Expand file tree Collapse file tree 11 files changed +243
-8
lines changed Expand file tree Collapse file tree 11 files changed +243
-8
lines changed Original file line number Diff line number Diff line change 77    (psumbera)
88  . Fixed bug GH-19053 (Duplicate property slot with hooks and interface
99    property). (ilutov)
10+   . Fixed bug GH-19044 (Protected properties are not scoped according to their
11+     prototype). (Bob)
1012
1113- Hash:
1214  . Fix crash on clone failure. (nielsdos)
@@ -49,9 +51,6 @@ PHP                                                                        NEWS
4951  . Fixed bug GH-18907 (Leak when creating cycle in hook). (ilutov)
5052  . Fix OSS-Fuzz #427814456. (nielsdos)
5153  . Fix OSS-Fuzz #428983568 and #428760800. (nielsdos)
52-   . Fixed bug GH-17204 (-Wuseless-escape warnings emitted by re2c). (Peter Kokot)
53-   . Fixed bug GH-19064 (Undefined symbol 'execute_ex' on Windows ARM64).
54-     (Demon)
5554
5655- Curl:
5756  . Fix memory leaks when returning refcounted value from curl callback.
Original file line number Diff line number Diff line change 1+ --TEST--
2+ GH-19044: Protected properties must be scoped according to their prototype (protected(set) on non-hooked property)
3+ --FILE--
4+ <?php 
5+ 
6+ class  P {
7+     public  mixed  $ foo  { get => 42 ; }
8+ }
9+ 
10+ class  C1  extends  P {
11+     public  protected(set)  mixed  $ foo  = 1 ;
12+ }
13+ 
14+ class  C2  extends  P {
15+     public  protected(set)  mixed  $ foo ;
16+ 
17+     static  function  foo ($ c ) { return  $ c ->foo  += 1 ; }
18+ }
19+ 
20+ var_dump (C2 ::foo (new  C1 ));
21+ 
22+ ?> 
23+ --EXPECT--
24+ int(43)
Original file line number Diff line number Diff line change 1+ --TEST--
2+ GH-19044: Protected properties must be scoped according to their prototype
3+ --FILE--
4+ <?php 
5+ 
6+ abstract  class  P {
7+     protected  $ foo ;
8+ }
9+ 
10+ class  C1  extends  P {
11+     protected  $ foo  = 1 ;
12+ }
13+ 
14+ class  C2  extends  P {
15+     protected  $ foo  = 2 ;
16+     
17+     static  function  foo ($ c ) { return  $ c ->foo ; }
18+ }
19+ 
20+ var_dump (C2 ::foo (new  C2 ));
21+ var_dump (C2 ::foo (new  C1 ));
22+ 
23+ ?> 
24+ --EXPECT--
25+ int(2)
26+ int(1)
Original file line number Diff line number Diff line change 1+ --TEST--
2+ GH-19044: Protected properties must be scoped according to their prototype (common ancestor has a protected setter)
3+ --FILE--
4+ <?php 
5+ 
6+ abstract  class  P {
7+     abstract  public  mixed  $ foo  { get; }
8+ }
9+ 
10+ class  C1  extends  P {
11+     public  protected(set)  mixed  $ foo  { get => 1 ; set {} }
12+ }
13+ 
14+ class  GrandC1 extends  C1  {
15+     public  protected(set)  mixed  $ foo  { get => 2 ; set {} }
16+ }
17+ 
18+ class  C2  extends  C1  {
19+     static  function  foo ($ c ) { return  $ c ->foo  += 1 ; }
20+ }
21+ 
22+ var_dump (C2 ::foo (new  GrandC1 ));
23+ 
24+ ?> 
25+ --EXPECT--
26+ int(3)
Original file line number Diff line number Diff line change 1+ --TEST--
2+ GH-19044: Protected properties must be scoped according to their prototype (common ancestor does not have a setter)
3+ --FILE--
4+ <?php 
5+ 
6+ abstract  class  P {
7+     abstract  public  mixed  $ foo  { get; }
8+ }
9+ 
10+ class  C1  extends  P {
11+     public  mixed  $ foo  { get => 1 ; }
12+ }
13+ 
14+ class  GrandC1 extends  C1  {
15+     public  protected(set)  mixed  $ foo  { get => 2 ; set {} }
16+ }
17+ 
18+ class  C2  extends  C1  {
19+     static  function  foo ($ c ) { return  $ c ->foo  += 1 ; }
20+ }
21+ 
22+ var_dump (C2 ::foo (new  GrandC1 ));
23+ 
24+ ?> 
25+ --EXPECT--
26+ int(3)
Original file line number Diff line number Diff line change 1+ --TEST--
2+ GH-19044: Protected properties must be scoped according to their prototype (abstract parent defining visibility only takes precedence)
3+ --FILE--
4+ <?php 
5+ 
6+ abstract  class  P {
7+     abstract  protected(set)  mixed  $ foo  { get; set; }
8+ }
9+ 
10+ class  C1  extends  P {
11+     public  protected(set)  mixed  $ foo  { get => 2 ; set {} }
12+ }
13+ 
14+ class  C2  extends  P {
15+     public  mixed  $ foo  = 1 ;
16+ 
17+     static  function  foo ($ c ) { return  $ c ->foo  += 1 ; }
18+ }
19+ 
20+ var_dump (C2 ::foo (new  C1 ));
21+ 
22+ ?> 
23+ --EXPECT--
24+ int(3)
Original file line number Diff line number Diff line change 1+ --TEST--
2+ GH-19044: Protected properties must be scoped according to their prototype (abstract parent sets protected(set) with not having grandparent a setter - both inherit from parent)
3+ --FILE--
4+ <?php 
5+ 
6+ abstract  class  GP  {
7+     abstract  mixed  $ foo  { get; }
8+ }
9+ 
10+ abstract  class  P extends  GP  {
11+     abstract  protected(set)  mixed  $ foo  { get; set; }
12+ }
13+ 
14+ class  C1  extends  P {
15+     public  protected(set)  mixed  $ foo  { get => 2 ; set {} }
16+ }
17+ 
18+ class  C2  extends  P {
19+     public  mixed  $ foo  = 1 ;
20+ 
21+     static  function  foo ($ c ) { return  $ c ->foo  += 1 ; }
22+ }
23+ 
24+ var_dump (C2 ::foo (new  C1 ));
25+ 
26+ ?> 
27+ --EXPECT--
28+ int(3)
Original file line number Diff line number Diff line change 1+ --TEST--
2+ GH-19044: Protected properties must be scoped according to their prototype (abstract parent sets protected(set) with not having grandparent a setter - one inherits from grandparent)
3+ --FILE--
4+ <?php 
5+ 
6+ abstract  class  GP  {
7+     abstract  mixed  $ foo  { get; }
8+ }
9+ 
10+ abstract  class  P extends  GP  {
11+     abstract  protected(set)  mixed  $ foo  { get; set; }
12+ }
13+ 
14+ class  C1  extends  P {
15+     public  protected(set)  mixed  $ foo  { get => 2 ; set {} }
16+ }
17+ 
18+ class  C2  extends  GP  {
19+     public  mixed  $ foo  = 1 ;
20+ 
21+     static  function  foo ($ c ) { return  $ c ->foo  += 1 ; }
22+ }
23+ 
24+ var_dump (C2 ::foo (new  C1 ));
25+ 
26+ ?> 
27+ --EXPECT--
28+ int(3)
Original file line number Diff line number Diff line change 1+ --TEST--
2+ GH-19044: Protected properties must be scoped according to their prototype (abstract parent has implicit set hook)
3+ --FILE--
4+ <?php 
5+ 
6+ abstract  class  GP  {
7+     public  abstract  mixed  $ foo  { get; }
8+ }
9+ 
10+ class  P extends  GP  {
11+     public  protected(set)  mixed  $ foo  { get => $ this  ->foo ; }
12+ }
13+ 
14+ class  C1  extends  P {
15+     public  protected(set)  mixed  $ foo  = 1 ;
16+ }
17+ 
18+ class  C2  extends  P {
19+     public  protected(set)  mixed  $ foo ;
20+ 
21+     static  function  foo ($ c ) { return  $ c ->foo  += 1 ; }
22+ }
23+ 
24+ var_dump (C2 ::foo (new  C1 ));
25+ 
26+ ?> 
27+ --EXPECT--
28+ int(2)
Original file line number Diff line number Diff line change 1+ --TEST--
2+ GH-19044: Protected properties must be scoped according to their prototype (hooks variation)
3+ --FILE--
4+ <?php 
5+ 
6+ abstract  class  P {
7+     abstract  protected  $ foo  { get; }
8+ }
9+ 
10+ class  C1  extends  P {
11+     protected  $ foo  = 1 ;
12+ }
13+ 
14+ class  C2  extends  P {
15+     protected  $ foo  = 2 ;
16+     
17+     static  function  foo ($ c ) { return  $ c ->foo ; }
18+ }
19+ 
20+ var_dump (C2 ::foo (new  C2 ));
21+ var_dump (C2 ::foo (new  C1 ));
22+ 
23+ ?> 
24+ --EXPECT--
25+ int(2)
26+ int(1)
    
 
   
 
     
   
   
          
     
  
    
     
 
    
      
     
 
     
    You can’t perform that action at this time.
  
 
    
  
     
    
      
        
     
 
       
      
     
   
 
    
    
  
 
  
 
     
    
0 commit comments