Skip to content

Commit

Permalink
"::class" Feature:
Browse files Browse the repository at this point in the history
* Added class scope checking for self,parent+static
* Fixed tab/spaces in phpt file
  • Loading branch information
ralphschindler committed Sep 8, 2012
1 parent 76703a0 commit 26d592a
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 13 deletions.
25 changes: 12 additions & 13 deletions Zend/tests/class_name_scalar.phpt
Expand Up @@ -4,7 +4,7 @@ class name as scaler from ::class keyword
<?php

namespace Foo\Bar {
class One {}
class One {}
class Two extends One {
public static function run() {
var_dump(self::class);
Expand All @@ -15,28 +15,27 @@ namespace Foo\Bar {
}
class Three extends Two {}
echo "In NS\n";
var_dump(Moo::CLASS); // resolve in namespace
var_dump(Moo::CLASS); // resolve in namespace
}

namespace {
use Bee\Bop as Moo,
Foo\Bar\One;
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);
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
}


?>
--EXPECTF--
--EXPECTF--
In NS
string(11) "Foo\Bar\Moo"
Top
Expand Down
9 changes: 9 additions & 0 deletions Zend/zend_compile.c
Expand Up @@ -2169,12 +2169,21 @@ void zend_resolve_class_name(znode *class_name, ulong fetch_type, int check_ns_n
lctype = zend_get_class_fetch_type(lcname, strlen(lcname));
switch (lctype) {
case ZEND_FETCH_CLASS_SELF:
if (!CG(active_class_entry)) {
zend_error(E_COMPILE_ERROR, "Cannot access self::class when no class scope is active");
}
tmp.op_type = IS_CONST;
ZVAL_STRINGL(&tmp.u.constant, CG(active_class_entry)->name, strlen(CG(active_class_entry)->name), 1);
*class_name = tmp;
break;
case ZEND_FETCH_CLASS_STATIC:
if (!CG(active_class_entry)) {
zend_error(E_COMPILE_ERROR, "Cannot access static::class when no class scope is active");
}
case ZEND_FETCH_CLASS_PARENT:
if (!CG(active_class_entry)) {
zend_error(E_COMPILE_ERROR, "Cannot access parent::class when no class scope is active");
}
opline = get_next_op(CG(active_op_array) TSRMLS_CC);
opline->opcode = ZEND_DO_FCALL;
opline->result.var = get_temporary_variable(CG(active_op_array));
Expand Down

0 comments on commit 26d592a

Please sign in to comment.