1--TEST-- 2Testing Closure::fromCallable() functionality: Errors 3--FILE-- 4<?php 5 6include('closure_from_callable.inc'); 7 8echo 'Cannot access privateInstance method statically'."\n"; 9try { 10 $fn = Closure::fromCallable(['Foo', 'privateInstanceFunc']); 11 echo "Test failed to fail and return was : ".var_export($fn, true)."\n"; 12} 13catch (\TypeError $te) { 14 //This is the expected outcome. 15} 16catch (\Throwable $t) { 17 echo "Wrong exception type thrown: ".get_class($t)." : ".$t->getMessage()."\n"; 18} 19 20 21echo 'Cannot access privateInstance method statically with colon scheme'."\n"; 22try { 23 $fn = Closure::fromCallable('Foo::privateInstanceFunc'); 24 echo "Test failed to fail and return was : ".var_export($fn, true)."\n"; 25} 26catch (\TypeError $te) { 27 //This is the expected outcome. 28} 29catch (\Throwable $t) { 30 echo "Wrong exception type thrown: ".get_class($t)." : ".$t->getMessage()."\n"; 31} 32 33echo 'Cannot access privateInstance method'."\n"; 34try { 35 $fn = Closure::fromCallable([new Foo, 'privateInstanceFunc']); 36 echo "Test failed to fail and return was : ".var_export($fn, true)."\n"; 37} 38catch (\TypeError $te) { 39 //This is the expected outcome. 40} 41catch (\Throwable $t) { 42 echo "Wrong exception type thrown: ".get_class($t)." : ".$t->getMessage()."\n"; 43} 44 45echo 'SubClass cannot access private instance method'."\n"; 46try { 47 $fn = Closure::fromCallable([new SubFoo, 'privateInstanceFunc']); 48 echo "Test failed to fail, closure is : ".var_export($fn, true)."\n"; 49} 50catch (\TypeError $te) { 51 //This is the expected outcome. 52} 53catch (\Throwable $t) { 54 echo "Wrong exception type thrown: ".get_class($t)." : ".$t->getMessage()."\n"; 55} 56 57echo 'Cannot access private static function of instance'."\n"; 58try { 59 $fn = Closure::fromCallable([new Foo, 'privateStaticFunction']); 60 echo "Test failed to fail, closure is : ".var_export($fn, true)."\n"; 61} 62catch (\TypeError $te) { 63 //This is the expected outcome. 64} 65catch (\Throwable $t) { 66 echo "Wrong exception type thrown: ".get_class($t)." : ".$t->getMessage()."\n"; 67} 68 69echo 'Cannot access private static method statically'."\n"; 70try { 71 $fn = Closure::fromCallable(['Foo', 'privateStaticFunction']); 72 echo "Test failed to fail, closure is : ".var_export($fn, true)."\n"; 73} 74catch (\TypeError $te) { 75 //This is the expected outcome. 76} 77catch (\Throwable $t) { 78 echo "Wrong exception type thrown: ".get_class($t)." : ".$t->getMessage()."\n"; 79} 80 81echo 'Cannot access private static method statically with colon scheme'."\n"; 82try { 83 $fn = Closure::fromCallable('Foo::privateStaticFunction'); 84 echo "Test failed to fail, closure is : ".var_export($fn, true)."\n"; 85} 86catch (\TypeError $te) { 87 //This is the expected outcome. 88} 89catch (\Throwable $t) { 90 echo "Wrong exception type thrown: ".get_class($t)." : ".$t->getMessage()."\n"; 91} 92 93echo 'Non-existent method should fail'."\n"; 94try { 95 $fn = Closure::fromCallable('Foo::nonExistentFunction'); 96 echo "Test failed to fail, closure is : ".var_export($fn, true)."\n"; 97} 98catch (\TypeError $te) { 99 //This is the expected outcome. 100} 101catch (\Throwable $t) { 102 echo "Wrong exception type thrown: ".get_class($t)." : ".$t->getMessage()."\n"; 103} 104 105echo 'Non-existent class should fail'."\n"; 106try { 107 $fn = Closure::fromCallable(['NonExistentClass', 'foo']); 108 echo "Test failed to fail, closure is : ".var_export($fn, true)."\n"; 109} 110catch (\TypeError $te) { 111 //This is the expected outcome. 112} 113catch (\Throwable $t) { 114 echo "Wrong exception type thrown: ".get_class($t)." : ".$t->getMessage()."\n"; 115} 116 117echo 'Non-existent function should fail'."\n"; 118try { 119 $fn = Closure::fromCallable('thisDoesNotExist'); 120 echo "Test failed to fail, closure is : ".var_export($fn, true)."\n"; 121} 122catch (\TypeError $te) { 123 //This is the expected outcome. 124} 125catch (\Throwable $t) { 126 echo "Wrong exception type thrown: ".get_class($t)." : ".$t->getMessage()."\n"; 127} 128 129 130echo 'Subclass cannot closure over parent private instance method'."\n"; 131try { 132 $subFoo = new SubFoo; 133 $fn = $subFoo->closePrivateInvalid(); 134 echo "Test failed to fail, closure is : ".var_export($fn, true)."\n"; 135} 136catch (\TypeError $te) { 137 //This is the expected outcome. 138} 139catch (\Throwable $t) { 140 echo "Wrong exception type thrown: ".get_class($t)." : ".$t->getMessage()."\n"; 141} 142 143echo 'Subclass cannot closure over parant private static method'."\n"; 144try { 145 $subFoo = new SubFoo; 146 $fn = $subFoo->closePrivateStaticInvalid(); 147 echo "Test failed to fail, closure is : ".var_export($fn, true)."\n"; 148} 149catch (\TypeError $te) { 150 //This is the expected outcome. 151} 152catch (\Throwable $t) { 153 echo "Wrong exception type thrown: ".get_class($t)." : ".$t->getMessage()."\n"; 154} 155 156echo 'Function scope cannot closure over protected instance method'."\n"; 157try { 158 $fn = functionAccessProtected(); 159 echo "Test failed to fail, closure is : ".var_export($fn, true)."\n"; 160} 161catch (\TypeError $te) { 162 //This is the expected outcome. 163} 164catch (\Throwable $t) { 165 echo "Wrong exception type thrown: ".get_class($t)." : ".$t->getMessage()."\n"; 166} 167 168echo 'Function scope cannot closure over private instance method'."\n"; 169try { 170 $fn = functionAccessPrivate(); 171 echo "Test failed to fail, closure is : ".var_export($fn, true)."\n"; 172} 173catch (\TypeError $te) { 174 //This is the expected outcome. 175} 176catch (\Throwable $t) { 177 echo "Wrong exception type thrown: ".get_class($t)." : ".$t->getMessage()."\n"; 178} 179 180echo 'Access private instance method of parent object through "self::" to parent method'."\n"; 181try { 182 $foo = new SubFoo; 183 $fn = $foo->getSelfColonParentPrivateInstanceMethod(); 184 echo "Test failed to fail, closure is : ".var_export($fn, true)."\n"; 185} 186catch (\TypeError $te) { 187 //This is the expected outcome. 188} 189catch (\Throwable $t) { 190 echo "Wrong exception type thrown: ".get_class($t)." : ".$t->getMessage()."\n"; 191} 192 193echo "OK\n"; 194 195?> 196===DONE=== 197--EXPECT-- 198Cannot access privateInstance method statically 199Cannot access privateInstance method statically with colon scheme 200Cannot access privateInstance method 201SubClass cannot access private instance method 202Cannot access private static function of instance 203Cannot access private static method statically 204Cannot access private static method statically with colon scheme 205Non-existent method should fail 206Non-existent class should fail 207Non-existent function should fail 208Subclass cannot closure over parent private instance method 209Subclass cannot closure over parant private static method 210Function scope cannot closure over protected instance method 211Function scope cannot closure over private instance method 212Access private instance method of parent object through "self::" to parent method 213OK 214===DONE=== 215