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