13 changed files with 222 additions and 0 deletions
-
2NEWS
-
77Zend/tests/class_name_as_scalar.phpt
-
13Zend/tests/class_name_as_scalar_error_001.phpt
-
13Zend/tests/class_name_as_scalar_error_002.phpt
-
13Zend/tests/class_name_as_scalar_error_003.phpt
-
13Zend/tests/class_name_as_scalar_error_004.phpt
-
10Zend/tests/class_name_as_scalar_error_005.phpt
-
10Zend/tests/class_name_as_scalar_error_006.phpt
-
47Zend/zend_compile.c
-
2Zend/zend_compile.h
-
10Zend/zend_language_parser.y
-
3Zend/zend_vm_def.h
-
9Zend/zend_vm_execute.h
@ -0,0 +1,77 @@ |
|||
--TEST-- |
|||
class name as scalar from ::class keyword |
|||
--FILE-- |
|||
<?php |
|||
|
|||
namespace Foo\Bar { |
|||
class One { |
|||
// compile time constants |
|||
const A = self::class; |
|||
const B = Two::class; |
|||
} |
|||
class Two extends One { |
|||
public static function run() { |
|||
var_dump(self::class); // self compile time lookup |
|||
var_dump(static::class); // runtime lookup |
|||
var_dump(parent::class); // runtime lookup |
|||
var_dump(Baz::class); // default compile time lookup |
|||
} |
|||
} |
|||
class Three extends Two { |
|||
// compile time static lookups |
|||
public static function checkCompileTime( |
|||
$one = self::class, |
|||
$two = Baz::class, |
|||
$three = One::A, |
|||
$four = self::B |
|||
) { |
|||
var_dump($one, $two, $three, $four); |
|||
} |
|||
} |
|||
echo "In NS\n"; |
|||
var_dump(Moo::CLASS); // resolve in namespace |
|||
} |
|||
|
|||
namespace { |
|||
use Bee\Bop as Moo, |
|||
Foo\Bar\One; |
|||
echo "Top\n"; |
|||
var_dump(One::class); // resolve from use |
|||
var_dump(Boo::class); // resolve in global namespace |
|||
var_dump(Moo::CLASS); // resolve from use as |
|||
var_dump(\Moo::Class); // resolve fully qualified |
|||
$class = One::class; // assign class as scalar to var |
|||
$x = new $class; // create new class from original scalar assignment |
|||
var_dump($x); |
|||
Foo\Bar\Two::run(); // resolve runtime lookups |
|||
echo "Parent\n"; |
|||
Foo\Bar\Three::run(); // resolve runtime lookups with inheritance |
|||
echo "Compile Check\n"; |
|||
Foo\Bar\Three::checkCompileTime(); |
|||
} |
|||
|
|||
?> |
|||
--EXPECTF-- |
|||
In NS |
|||
string(11) "Foo\Bar\Moo" |
|||
Top |
|||
string(11) "Foo\Bar\One" |
|||
string(3) "Boo" |
|||
string(7) "Bee\Bop" |
|||
string(3) "Moo" |
|||
object(Foo\Bar\One)#1 (0) { |
|||
} |
|||
string(11) "Foo\Bar\Two" |
|||
string(11) "Foo\Bar\Two" |
|||
string(11) "Foo\Bar\One" |
|||
string(11) "Foo\Bar\Baz" |
|||
Parent |
|||
string(11) "Foo\Bar\Two" |
|||
string(13) "Foo\Bar\Three" |
|||
string(11) "Foo\Bar\One" |
|||
string(11) "Foo\Bar\Baz" |
|||
Compile Check |
|||
string(13) "Foo\Bar\Three" |
|||
string(11) "Foo\Bar\Baz" |
|||
string(11) "Foo\Bar\One" |
|||
string(11) "Foo\Bar\Two" |
|||
@ -0,0 +1,13 @@ |
|||
--TEST-- |
|||
class name as scalar from ::class keyword error using static in class constant |
|||
--FILE-- |
|||
<?php |
|||
|
|||
namespace Foo\Bar { |
|||
class One { |
|||
const Baz = static::class; |
|||
} |
|||
} |
|||
?> |
|||
--EXPECTF-- |
|||
Fatal error: static::class cannot be used for compile-time class name resolution in %s on line %d |
|||
@ -0,0 +1,13 @@ |
|||
--TEST-- |
|||
class name as scalar from ::class keyword error using parent in class constant |
|||
--FILE-- |
|||
<?php |
|||
|
|||
namespace Foo\Bar { |
|||
class One { |
|||
const Baz = parent::class; |
|||
} |
|||
} |
|||
?> |
|||
--EXPECTF-- |
|||
Fatal error: parent::class cannot be used for compile-time class name resolution in %s on line %d |
|||
@ -0,0 +1,13 @@ |
|||
--TEST-- |
|||
class name as scalar from ::class keyword error using static in method signature |
|||
--FILE-- |
|||
<?php |
|||
|
|||
namespace Foo\Bar { |
|||
class One { |
|||
public function baz($x = static::class) {} |
|||
} |
|||
} |
|||
?> |
|||
--EXPECTF-- |
|||
Fatal error: static::class cannot be used for compile-time class name resolution in %s on line %d |
|||
@ -0,0 +1,13 @@ |
|||
--TEST-- |
|||
class name as scalar from ::class keyword error using parent in method signature |
|||
--FILE-- |
|||
<?php |
|||
|
|||
namespace Foo\Bar { |
|||
class One { |
|||
public function baz($x = parent::class) {} |
|||
} |
|||
} |
|||
?> |
|||
--EXPECTF-- |
|||
Fatal error: parent::class cannot be used for compile-time class name resolution in %s on line %d |
|||
@ -0,0 +1,10 @@ |
|||
--TEST-- |
|||
class name as scalar from ::class keyword error using static non class context |
|||
--FILE-- |
|||
<?php |
|||
|
|||
$x = static::class; |
|||
|
|||
?> |
|||
--EXPECTF-- |
|||
Fatal error: Cannot access static::class when no class scope is active in %s on line %d |
|||
@ -0,0 +1,10 @@ |
|||
--TEST-- |
|||
class name as scalar from ::class keyword error using parent in non class context |
|||
--FILE-- |
|||
<?php |
|||
|
|||
$x = parent::class; |
|||
|
|||
?> |
|||
--EXPECTF-- |
|||
Fatal error: Cannot access parent::class when no class scope is active in %s on line %d |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue