Browse Source

Added __TRAIT__ magic constant [TRAITS] [DOC]

# __TRAIT__ behaves like __CLASS__ more or less but is constraint to traits.
# Since traits are not types, there are not many valid use cases, and trying
# to use __TRAIT__ to make traits more like classes is discouraged.
pull/7/head
Stefan Marr 15 years ago
parent
commit
dbc6849bca
  1. 36
      Zend/tests/traits/trait_constant_001.phpt
  2. 27
      Zend/tests/traits/trait_constant_002.phpt
  3. 2
      Zend/zend_language_parser.y
  4. 3374
      Zend/zend_language_scanner.c
  5. 20
      Zend/zend_language_scanner.l
  6. 2
      Zend/zend_language_scanner_defs.h
  7. 111
      ext/tokenizer/tests/token_get_all_variation12.phpt

36
Zend/tests/traits/trait_constant_001.phpt

@ -0,0 +1,36 @@
--TEST--
__TRAIT__: Basics, a constant denoiting the trait of definition.
--FILE--
<?php
trait TestTrait {
public static function test() {
return __TRAIT__;
}
}
class Direct {
use TestTrait;
}
class IndirectInheritance extends Direct {
}
trait TestTraitIndirect {
use TestTrait;
}
class Indirect {
use TestTraitIndirect;
}
echo Direct::test()."\n";
echo IndirectInheritance::test()."\n";
echo Indirect::test()."\n";
?>
--EXPECT--
TestTrait
TestTrait
TestTrait

27
Zend/tests/traits/trait_constant_002.phpt

@ -0,0 +1,27 @@
--TEST--
__TRAIT__: Use outside of traits.
--FILE--
<?php
class MyClass {
static function test() {
return __TRAIT__;
}
}
function someFun() {
return __TRAIT__;
}
$t = __TRAIT__;
var_dump($t);
$t = MyClass::test();
var_dump($t);
$t = someFun();
var_dump($t);
?>
--EXPECT--
string(0) ""
string(0) ""
string(0) ""

2
Zend/zend_language_parser.y

@ -187,6 +187,7 @@ static YYSIZE_T zend_yytnamerr(char*, const char*);
%token T_LIST "list (T_LIST)"
%token T_ARRAY "array (T_ARRAY)"
%token T_CLASS_C "__CLASS__ (T_CLASS_C)"
%token T_TRAIT_C "__TRAIT__ (T_TRAIT_C)"
%token T_METHOD_C "__METHOD__ (T_METHOD_C)"
%token T_FUNC_C "__FUNCTION__ (T_FUNC_C)"
%token T_LINE "__LINE__ (T_LINE)"
@ -879,6 +880,7 @@ common_scalar:
| T_FILE { $$ = $1; }
| T_DIR { $$ = $1; }
| T_CLASS_C { $$ = $1; }
| T_TRAIT_C { $$ = $1; }
| T_METHOD_C { $$ = $1; }
| T_FUNC_C { $$ = $1; }
| T_NS_C { $$ = $1; }

3374
Zend/zend_language_scanner.c
File diff suppressed because it is too large
View File

20
Zend/zend_language_scanner.l

@ -1563,6 +1563,26 @@ NEWLINE ("\r"|"\n"|"\r\n")
return T_CLASS_C;
}
<ST_IN_SCRIPTING>"__TRAIT__" {
char *trait_name = NULL;
if (CG(active_class_entry)
&& (ZEND_ACC_TRAIT ==
(CG(active_class_entry)->ce_flags & ZEND_ACC_TRAIT))) {
trait_name = CG(active_class_entry)->name;
}
if (!trait_name) {
trait_name = "";
}
zendlval->value.str.len = strlen(trait_name);
zendlval->value.str.val = estrndup(trait_name, zendlval->value.str.len);
zendlval->type = IS_STRING;
return T_TRAIT_C;
}
<ST_IN_SCRIPTING>"__FUNCTION__" {
char *func_name = NULL;

2
Zend/zend_language_scanner_defs.h

@ -1,4 +1,4 @@
/* Generated by re2c 0.13.5 on Wed Jul 27 02:06:14 2011 */
/* Generated by re2c 0.13.5 on Sun Jul 31 17:59:24 2011 */
#line 3 "Zend/zend_language_scanner_defs.h"
enum YYCONDTYPE {

111
ext/tokenizer/tests/token_get_all_variation12.phpt

@ -5,17 +5,18 @@ Test token_get_all() function : usage variations - with predefined language cons
--FILE--
<?php
/* Prototype : array token_get_all(string $source)
* Description: splits the given source into an array of PHP languange tokens
* Description: splits the given source into an array of PHP language tokens
* Source code: ext/tokenizer/tokenizer.c
*/
/*
* Testing token_get_all() with following predefined language constants:
* __FILE__ - T_FILE(364)
* __CLASS__ - T_CLASS_C(360)
* __FUNCTION__ - T_FUNC_C(362)
* __LINE__ - T_LINE(363)
* __METHOD__ - T_METHOD_C(361)
* __FILE__ - T_FILE
* __CLASS__ - T_CLASS_C
* __TRAIT__ - T_TRAIT_C
* __FUNCTION__ - T_FUNC_C
* __LINE__ - T_LINE
* __METHOD__ - T_METHOD_C
*/
echo "*** Testing token_get_all() : with language constants ***\n";
@ -27,12 +28,13 @@ $source = "<?php
?>";
var_dump( token_get_all($source));
// parsing __CLASS__ and __FUNCTION__ tokens
echo "-- with CLASS and FUNCTION --\n";
// parsing __CLASS__, __TRAIT__ and __FUNCTION__ tokens
echo "-- with CLASS, TRAIT and FUNCTION --\n";
$source = '<?php
class MyClass
{
echo __CLASS__;
echo __TRAIT__;
function myFunction()
{ echo __FUNCTION__; }
}
@ -165,8 +167,8 @@ array(16) {
int(%d)
}
}
-- with CLASS and FUNCTION --
array(30) {
-- with CLASS, TRAIT and FUNCTION --
array(35) {
[0]=>
array(3) {
[0]=>
@ -263,14 +265,14 @@ array(30) {
string(3) "
"
[2]=>
int(4)
int(%d)
}
[12]=>
array(3) {
[0]=>
int(%d)
[1]=>
string(8) "function"
string(4) "echo"
[2]=>
int(5)
}
@ -279,7 +281,7 @@ array(30) {
[0]=>
int(%d)
[1]=>
string(1) " "
string(2) " "
[2]=>
int(5)
}
@ -288,15 +290,13 @@ array(30) {
[0]=>
int(%d)
[1]=>
string(10) "myFunction"
string(9) "__TRAIT__"
[2]=>
int(5)
}
[15]=>
string(1) "("
string(1) ";"
[16]=>
string(1) ")"
[17]=>
array(3) {
[0]=>
int(%d)
@ -306,58 +306,99 @@ array(30) {
[2]=>
int(5)
}
[17]=>
array(3) {
[0]=>
int(%d)
[1]=>
string(8) "function"
[2]=>
int(6)
}
[18]=>
string(1) "{"
array(3) {
[0]=>
int(%d)
[1]=>
string(1) " "
[2]=>
int(6)
}
[19]=>
array(3) {
[0]=>
int(%d)
[1]=>
string(2) " "
string(10) "myFunction"
[2]=>
int(6)
}
[20]=>
string(1) "("
[21]=>
string(1) ")"
[22]=>
array(3) {
[0]=>
int(%d)
[1]=>
string(4) "echo"
string(3) "
"
[2]=>
int(6)
}
[21]=>
[23]=>
string(1) "{"
[24]=>
array(3) {
[0]=>
int(%d)
[1]=>
string(2) " "
[2]=>
int(6)
int(7)
}
[22]=>
[25]=>
array(3) {
[0]=>
int(%d)
[1]=>
string(4) "echo"
[2]=>
int(7)
}
[26]=>
array(3) {
[0]=>
int(%d)
[1]=>
string(2) " "
[2]=>
int(7)
}
[27]=>
array(3) {
[0]=>
int(%d)
[1]=>
string(12) "__FUNCTION__"
[2]=>
int(6)
int(7)
}
[23]=>
[28]=>
string(1) ";"
[24]=>
[29]=>
array(3) {
[0]=>
int(%d)
[1]=>
string(1) " "
[2]=>
int(6)
int(7)
}
[25]=>
[30]=>
string(1) "}"
[26]=>
[31]=>
array(3) {
[0]=>
int(%d)
@ -365,11 +406,11 @@ array(30) {
string(1) "
"
[2]=>
int(6)
int(7)
}
[27]=>
[32]=>
string(1) "}"
[28]=>
[33]=>
array(3) {
[0]=>
int(%d)
@ -377,16 +418,16 @@ array(30) {
string(1) "
"
[2]=>
int(7)
int(8)
}
[29]=>
[34]=>
array(3) {
[0]=>
int(%d)
[1]=>
string(2) "?>"
[2]=>
int(8)
int(9)
}
}
-- with LINE and METHOD --

Loading…
Cancel
Save