1--TEST-- 2Closure comparison 3--FILE-- 4<?php 5function foo() { 6 static $var; 7} 8 9$closures[0] = Closure::fromCallable('foo'); 10$closures[1] = Closure::fromCallable('foo'); 11 12printf("foo == foo: %s\n", $closures[0] == $closures[1] ? "OK" : "FAIL"); 13 14$closures[0] = Closure::fromCallable('strlen'); 15$closures[1] = Closure::fromCallable('strlen'); 16 17printf("strlen == strlen: %s\n", $closures[0] == $closures[1] ? "OK" : "FAIL"); 18 19$closures[0] = Closure::fromCallable('strlen'); 20$closures[1] = Closure::fromCallable('strrev'); 21 22printf("strlen != strrev: %s\n", $closures[0] != $closures[1] ? "OK" : "FAIL"); 23 24trait MethodTrait { 25 public function traitMethod(){} 26} 27 28class Foo { 29 use MethodTrait { 30 MethodTrait::traitMethod as aliasMethod; 31 } 32 33 public function __call($method, $args) { 34 35 } 36 37 public function exists() {} 38 39 public static function existsStatic() {} 40} 41 42class Bar extends Foo {} 43 44class Baz { 45 use MethodTrait; 46} 47 48$closures[0] = Closure::fromCallable([Foo::class, "existsStatic"]); 49$closures[1] = Closure::fromCallable([Bar::class, "existsStatic"]); 50 51printf("foo::existsStatic != bar::existsStatic: %s\n", $closures[0] != $closures[1] ? "OK" : "FAIL"); 52 53$foo = new Foo; 54 55$closures[0] = Closure::fromCallable([$foo, "exists"]); 56$closures[1] = $closures[0]->bindTo(new Foo); 57 58printf("foo#0::exists != foo#1::exists: %s\n", $closures[0] != $closures[1] ? "OK" : "FAIL"); 59 60$baz = new Baz; 61 62$closures[0] = Closure::fromCallable([$foo, "traitMethod"]); 63$closures[1] = Closure::fromCallable([$baz, "traitMethod"]); 64 65printf("foo::traitMethod != baz::traitMethod: %s\n", $closures[0] != $closures[1] ? "OK" : "FAIL"); 66 67$closures[0] = Closure::fromCallable([$foo, "traitMethod"]); 68$closures[1] = Closure::fromCallable([$foo, "aliasMethod"]); 69 70printf("foo::traitMethod != foo::aliasMethod: %s\n", $closures[0] != $closures[1] ? "OK" : "FAIL"); 71 72$closures[0] = Closure::fromCallable([$foo, "exists"]); 73$closures[1] = Closure::fromCallable([$foo, "exists"]); 74 75printf("foo::exists == foo::exists: %s\n", $closures[0] == $closures[1] ? "OK" : "FAIL"); 76 77$closures[0] = Closure::fromCallable([$foo, "method"]); 78$closures[1] = Closure::fromCallable([$foo, "method"]); 79 80printf("foo::method == foo::method: %s\n", $closures[0] == $closures[1] ? "OK" : "FAIL"); 81 82$closures[1] = $closures[1]->bindTo(new Bar); 83 84printf("foo::method != bar::method: %s\n", $closures[0] != $closures[1] ? "OK" : "FAIL"); 85 86$closures[0] = Closure::fromCallable([$foo, "method"]); 87$closures[1] = Closure::fromCallable([$foo, "method2"]); 88 89printf("foo::method != foo::method2: %s\n", $closures[0] != $closures[1] ? "OK" : "FAIL"); 90 91$closures[2] = Closure::fromCallable([$closures[0], "__invoke"]); 92$closures[3] = Closure::fromCallable([$closures[1], "__invoke"]); 93 94printf("Closure[0]::invoke != Closure[1]::invoke: %s\n", $closures[2] != $closures[3] ? "OK" : "FAIL"); 95 96$closures[2] = Closure::fromCallable([$closures[0], "__invoke"]); 97$closures[3] = Closure::fromCallable([$closures[0], "__invoke"]); 98 99printf("Closure[0]::invoke == Closure[0]::invoke: %s\n", $closures[2] == $closures[3] ? "OK" : "FAIL"); 100?> 101--EXPECT-- 102foo == foo: OK 103strlen == strlen: OK 104strlen != strrev: OK 105foo::existsStatic != bar::existsStatic: OK 106foo#0::exists != foo#1::exists: OK 107foo::traitMethod != baz::traitMethod: OK 108foo::traitMethod != foo::aliasMethod: OK 109foo::exists == foo::exists: OK 110foo::method == foo::method: OK 111foo::method != bar::method: OK 112foo::method != foo::method2: OK 113Closure[0]::invoke != Closure[1]::invoke: OK 114Closure[0]::invoke == Closure[0]::invoke: OK 115