xref: /PHP-8.3/Zend/tests/bug37632.phpt (revision d30cd7d7)
1--TEST--
2Bug #37632 (Protected method access problem)
3--FILE--
4<?php
5
6class A1
7{
8    protected function test()
9    {
10        echo __METHOD__ . "\n";
11    }
12}
13
14class B1 extends A1
15{
16    public function doTest(A1 $obj)
17    {
18        echo __METHOD__ . "\n";
19        $obj->test();
20    }
21}
22
23class C1 extends A1
24{
25    protected function test()
26    {
27        echo __METHOD__ . "\n";
28    }
29}
30
31$b = new B1;
32$b->doTest(new C1);
33
34class A2
35{
36    static protected function test()
37    {
38        echo __METHOD__ . "\n";
39    }
40}
41
42class B2 extends A2
43{
44    static public function doTest(A2 $obj)
45    {
46        echo __METHOD__ . "\n";
47        $obj->test();
48    }
49}
50
51class C2 extends A2
52{
53    static protected function test()
54    {
55        echo __METHOD__ . "\n";
56    }
57}
58
59B2::doTest(new C2);
60
61/* Right now Ctor's cannot be made protected when defined in a ctor. That is
62 * we cannot decrease visibility.
63 *
64
65interface Ctor
66{
67    function __construct($x);
68}
69
70class A3 implements Ctor
71{
72    protected function __construct()
73    {
74        echo __METHOD__ . "\n";
75    }
76}
77
78class B3 extends A3
79{
80    static public function doTest()
81    {
82        echo __METHOD__ . "\n";
83        new C3;
84    }
85}
86
87class C3 extends A3
88{
89    protected function __construct()
90    {
91        echo __METHOD__ . "\n";
92    }
93}
94
95B3::doTest();
96
97*/
98
99class A4
100{
101    protected function __construct()
102    {
103        echo __METHOD__ . "\n";
104    }
105}
106
107class B4 extends A4
108{
109    static public function doTest()
110    {
111        echo __METHOD__ . "\n";
112        new C4;
113    }
114}
115
116class C4 extends A4
117{
118    protected function __construct()
119    {
120        echo __METHOD__ . "\n";
121    }
122}
123
124B4::doTest();
125
126?>
127===DONE===
128--EXPECTF--
129B1::doTest
130C1::test
131B2::doTest
132C2::test
133B4::doTest
134
135Fatal error: Uncaught Error: Call to protected C4::__construct() from scope B4 in %s:%d
136Stack trace:
137#0 %s(%d): B4::doTest()
138#1 {main}
139  thrown in %sbug37632.php on line %d
140