[prev in list] [next in list] [prev in thread] [next in thread] 

List:       php-cvs
Subject:    [PHP-CVS] =?utf-8?q?svn:_/php/php-src/trunk/ext/reflection/_php=5Freflection.c_tests/ReflectionClass
From:       Johannes_Schlüter <johannes () php ! net>
Date:       2010-05-30 1:00:45
Message-ID: svn-johannes-1275181245-299946-1785509799 () svn ! php ! net
[Download RAW message or body]

johannes                                 Sun, 30 May 2010 01:00:45 +0000

Revision: http://svn.php.net/viewvc?view=revision&revision=299946

Log:
- More trait reflection work
#- I'm not happy about ReflectionClass::getTraitAliases, yet

Changed paths:
    U   php/php-src/trunk/ext/reflection/php_reflection.c
    U   php/php-src/trunk/ext/reflection/tests/ReflectionClass_toString_001.phpt
    A   php/php-src/trunk/ext/reflection/tests/traits004.phpt
    A   php/php-src/trunk/ext/reflection/tests/traits005.phpt

Modified: php/php-src/trunk/ext/reflection/php_reflection.c
===================================================================
--- php/php-src/trunk/ext/reflection/php_reflection.c	2010-05-30 00:51:55 UTC (rev \
                299945)
+++ php/php-src/trunk/ext/reflection/php_reflection.c	2010-05-30 01:00:45 UTC (rev \
299946) @@ -4254,6 +4254,80 @@
 }
 /* }}} */

+/* {{{ proto public ReflectionClass[] ReflectionClass::getTraits()
+   Returns an array of traits used by this class */
+ZEND_METHOD(reflection_class, getTraits)
+{
+	reflection_object *intern;
+	zend_class_entry *ce;
+	zend_uint i;
+
+	if (zend_parse_parameters_none() == FAILURE) {
+		return;
+	}
+	GET_REFLECTION_OBJECT_PTR(ce);
+
+	array_init(return_value);
+
+	for (i=0; i < ce->num_traits; i++) {
+		zval *trait;
+		ALLOC_ZVAL(trait);
+		zend_reflection_class_factory(ce->traits[i], trait TSRMLS_CC);
+		add_assoc_zval_ex(return_value, ce->traits[i]->name, ce->traits[i]->name_length + \
1, trait); +	}
+}
+/* }}} */
+
+/* {{{ proto public String[] ReflectionClass::getTraitNames()
+   Returns an array of names of traits used by this class */
+ZEND_METHOD(reflection_class, getTraitNames)
+{
+	reflection_object *intern;
+	zend_class_entry *ce;
+	zend_uint i;
+
+	if (zend_parse_parameters_none() == FAILURE) {
+		return;
+	}
+	GET_REFLECTION_OBJECT_PTR(ce);
+
+	array_init(return_value);
+
+	for (i=0; i < ce->num_traits; i++) {
+		add_next_index_stringl(return_value, ce->traits[i]->name, \
ce->traits[i]->name_length, 1); +	}
+}
+/* }}} */
+
+/* {{{ proto public arra ReflectionClass::getTraitaliases()
+   Returns an array of trait aliases */
+ZEND_METHOD(reflection_class, getTraitAliases)
+{
+	reflection_object *intern;
+	zend_class_entry *ce;
+
+	if (zend_parse_parameters_none() == FAILURE) {
+		return;
+	}
+	GET_REFLECTION_OBJECT_PTR(ce);
+
+	array_init(return_value);
+
+	if (ce->trait_aliases) {
+		zend_uint i = 0;
+		while (ce->trait_aliases[i]) {
+			char *method_name;
+			int method_name_len;
+			zend_trait_method_reference *cur_ref = ce->trait_aliases[i]->trait_method;
+
+			method_name_len = spprintf(&method_name, 0, "%s::%s", cur_ref->class_name, \
cur_ref->method_name); +			add_assoc_stringl_ex(return_value, \
ce->trait_aliases[i]->alias, ce->trait_aliases[i]->alias_len + 1, method_name, \
method_name_len, 0); +			i++;
+		}
+	}
+}
+/* }}} */
+
 /* {{{ proto public ReflectionClass ReflectionClass::getParentClass()
    Returns the class' parent class, or, if none exists, FALSE */
 ZEND_METHOD(reflection_class, getParentClass)
@@ -5636,6 +5710,9 @@
 	ZEND_ME(reflection_class, getInterfaces, arginfo_reflection__void, 0)
 	ZEND_ME(reflection_class, getInterfaceNames, arginfo_reflection__void, 0)
 	ZEND_ME(reflection_class, isInterface, arginfo_reflection__void, 0)
+	ZEND_ME(reflection_class, getTraits, arginfo_reflection__void, 0)
+	ZEND_ME(reflection_class, getTraitNames, arginfo_reflection__void, 0)
+	ZEND_ME(reflection_class, getTraitAliases, arginfo_reflection__void, 0)
 	ZEND_ME(reflection_class, isTrait, arginfo_reflection__void, 0)
 	ZEND_ME(reflection_class, isAbstract, arginfo_reflection__void, 0)
 	ZEND_ME(reflection_class, isFinal, arginfo_reflection__void, 0)

Modified: php/php-src/trunk/ext/reflection/tests/ReflectionClass_toString_001.phpt
===================================================================
--- php/php-src/trunk/ext/reflection/tests/ReflectionClass_toString_001.phpt	2010-05-30 \
                00:51:55 UTC (rev 299945)
+++ php/php-src/trunk/ext/reflection/tests/ReflectionClass_toString_001.phpt	2010-05-30 \
01:00:45 UTC (rev 299946) @@ -34,7 +34,7 @@
     Property [ <default> public $name ]
   }

-  - Methods [44] {
+  - Methods [47] {
     Method [ <internal:Reflection> final private method __clone ] {

       - Parameters [0] {
@@ -188,6 +188,24 @@
       }
     }

+    Method [ <internal:Reflection> public method getTraits ] {
+
+      - Parameters [0] {
+      }
+    }
+
+    Method [ <internal:Reflection> public method getTraitNames ] {
+
+      - Parameters [0] {
+      }
+    }
+
+    Method [ <internal:Reflection> public method getTraitAliases ] {
+
+      - Parameters [0] {
+      }
+    }
+
     Method [ <internal:Reflection> public method isTrait ] {

       - Parameters [0] {

Added: php/php-src/trunk/ext/reflection/tests/traits004.phpt
===================================================================
--- php/php-src/trunk/ext/reflection/tests/traits004.phpt	                        \
                (rev 0)
+++ php/php-src/trunk/ext/reflection/tests/traits004.phpt	2010-05-30 01:00:45 UTC \
(rev 299946) @@ -0,0 +1,58 @@
+--TEST--
+ReflectionClass::getTraits() and ReflectionClass::getTraitNames
+--FILE--
+<?php
+trait T1 { }
+trait T2 { }
+
+class C1 { }
+class C2 { use T1; }
+class C3 { use T1; use T2; }
+
+for ($c = "C1"; $c <= "C3"; $c++) {
+    echo "class $c:\n";
+    $r = new ReflectionClass($c);
+    var_dump($r->getTraitNames());
+    var_dump($r->getTraits());
+    echo "\n";
+}
+--EXPECT--
+class C1:
+array(0) {
+}
+array(0) {
+}
+
+class C2:
+array(1) {
+  [0]=>
+  string(2) "T1"
+}
+array(1) {
+  ["T1"]=>
+  &object(ReflectionClass)#1 (1) {
+    ["name"]=>
+    string(2) "T1"
+  }
+}
+
+class C3:
+array(2) {
+  [0]=>
+  string(2) "T1"
+  [1]=>
+  string(2) "T2"
+}
+array(2) {
+  ["T1"]=>
+  &object(ReflectionClass)#2 (1) {
+    ["name"]=>
+    string(2) "T1"
+  }
+  ["T2"]=>
+  &object(ReflectionClass)#3 (1) {
+    ["name"]=>
+    string(2) "T2"
+  }
+}
+


Property changes on: php/php-src/trunk/ext/reflection/tests/traits004.phpt
___________________________________________________________________
Added: svn:keywords
   + Id Rev Revision
Added: svn:eol-style
   + native

Added: php/php-src/trunk/ext/reflection/tests/traits005.phpt
===================================================================
--- php/php-src/trunk/ext/reflection/tests/traits005.phpt	                        \
                (rev 0)
+++ php/php-src/trunk/ext/reflection/tests/traits005.phpt	2010-05-30 01:00:45 UTC \
(rev 299946) @@ -0,0 +1,41 @@
+--TEST--
+ReflectionClass::getTraitAlias
+--FILE--
+<?php
+trait T1 { function m1() { } function m2() { } }
+
+class C1 { }
+class C2 { use T1; }
+class C3 { use T1 { m1 as a1; } }
+class C4 { use T1 { m1 as a1; m2 as a2; } }
+
+for ($c = "C1"; $c <= "C4"; $c++) {
+    echo "class $c:\n";
+    $r = new ReflectionClass($c);
+    var_dump($r->getTraitAliases());
+    echo "\n";
+}
+?>
+--EXPECT--
+class C1:
+array(0) {
+}
+
+class C2:
+array(0) {
+}
+
+class C3:
+array(1) {
+  ["a1"]=>
+  string(10) "(null)::m1"
+}
+
+class C4:
+array(2) {
+  ["a1"]=>
+  string(10) "(null)::m1"
+  ["a2"]=>
+  string(10) "(null)::m2"
+}
+


Property changes on: php/php-src/trunk/ext/reflection/tests/traits005.phpt
___________________________________________________________________
Added: svn:keywords
   + Id Rev Revision
Added: svn:eol-style
   + native



-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic