helly Fri Oct 24 14:24:29 2003 EDT Modified files: /ZendEngine2 ZEND_CHANGES zend_API.c zend_execute_API.c /php-src/ext/sockets sockets.c Log: Zend/ZEND_CHANGES Index: ZendEngine2/ZEND_CHANGES diff -u ZendEngine2/ZEND_CHANGES:1.61 ZendEngine2/ZEND_CHANGES:1.62 --- ZendEngine2/ZEND_CHANGES:1.61 Tue Oct 21 02:41:26 2003 +++ ZendEngine2/ZEND_CHANGES Fri Oct 24 14:24:27 2003 @@ -651,6 +651,79 @@ TBD: Respect visibility: Show protected only when inside class method and only otherwise public properties only. + Each class whose instances can be iterated with foreach should + implement the empty interface 'Traversable'. Hence any object + that says it implements 'Traversable' can be used with forach. + + The interfaces 'IteratorAggregate' and 'Iterator' allow to specify + how class objects are iterated in PHP code. The first of them simply + has a method 'getIterator' which must return an array or an object + that either implements the interface 'Iterator' or is instantiated + from an internal class that can be iterated. + + Example: + + <?php + class ObjectIterator implements Iterator { + + private $obj; + private $num; + + function __construct($obj) { + $this->obj = $obj; + } + function rewind() { + $this->num = 0; + } + function hasMore() { + return $this->num < $this->obj->max; + } + function key() { + return $this->num; + } + function current() { + switch($this->num) { + case 0: return "1st"; + case 1: return "2nd"; + case 2: return "3rd"; + default: return $this->num."th"; + } + } + function next() { + $this->num++; + } + } + + class Oject implements IteratorAggregate { + + public $max = 3; + + function getIterator() { + return new ObjectIterator($this); + } + } + + $obj = new Object; + + // this foreach ... + foreach($obj as $key => $val) { + echo "$key = $val\n"; + } + + // matches the following 7 lines with the for directive. + $it = $obj->getIterator(); + for($it->rewind(); $it->hasMore(); $it->next) { + $key = $it->current(); + $val = $it->key(); + echo "$key = $val\n"; + } + unset($it); + ?> + + The matching for directive is very intersting here since it shows + the use of all abstract methods declared in the interfaces Iterator + and IteratorAggregate respectively. + * __METHOD__ The pseudo constant __METHOD__ shows the current class and method Index: ZendEngine2/zend_API.c diff -u ZendEngine2/zend_API.c:1.221 ZendEngine2/zend_API.c:1.222 --- ZendEngine2/zend_API.c:1.221 Wed Oct 22 15:59:58 2003 +++ ZendEngine2/zend_API.c Fri Oct 24 14:24:27 2003 @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_API.c,v 1.221 2003/10/22 19:59:58 helly Exp $ */ +/* $Id: zend_API.c,v 1.222 2003/10/24 18:24:27 helly Exp $ */ #include "zend.h" #include "zend_execute.h" @@ -1588,8 +1588,23 @@ return 1; lcname = zend_str_tolower_dup(Z_STRVAL_P(callable), Z_STRLEN_P(callable)); - if (zend_hash_exists(EG(function_table), lcname, Z_STRLEN_P(callable)+1)) + if (zend_hash_exists(EG(function_table), lcname, Z_STRLEN_P(callable)+1)) { retval = 1; + } else { + char *func_pos; + if ((func_pos=strstr(lcname, "::"))) { + int lcclass_len = (int)(func_pos - lcname); + char *lcclass = estrndup(lcname, lcclass_len); + zend_class_entry **ce; + + if (zend_lookup_class(lcclass, lcclass_len, &ce TSRMLS_CC) == SUCCESS) { + int func_len = Z_STRLEN_P(callable) - lcclass_len - 2; + func_pos += 2; + retval = zend_hash_exists(&(*ce)->function_table, func_pos, func_len + 1) ? 1 : 0; + } + efree(lcclass); + } + } efree(lcname); break; Index: ZendEngine2/zend_execute_API.c diff -u ZendEngine2/zend_execute_API.c:1.237 ZendEngine2/zend_execute_API.c:1.238 --- ZendEngine2/zend_execute_API.c:1.237 Tue Oct 14 10:36:23 2003 +++ ZendEngine2/zend_execute_API.c Fri Oct 24 14:24:27 2003 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_execute_API.c,v 1.237 2003/10/14 14:36:23 stas Exp $ */ +/* $Id: zend_execute_API.c,v 1.238 2003/10/24 18:24:27 helly Exp $ */ #include <stdio.h> #include <signal.h> @@ -532,7 +532,8 @@ zend_execute_data execute_data; zval *method_name; zval *params_array; - int call_via_handler = 0; + int call_via_handler = 0, success; + char *func_pos; switch (fci->size) { case sizeof(zend_fcall_info): @@ -616,7 +617,26 @@ function_name_lc = zend_str_tolower_dup(fci->function_name->value.str.val, fci->function_name->value.str.len); - if (zend_hash_find(fci->function_table, function_name_lc, fci->function_name->value.str.len+1, (void **) &EX(function_state).function)==FAILURE) { + success = zend_hash_find(fci->function_table, function_name_lc, fci->function_name->value.str.len+1, (void **) &EX(function_state).function); + if (success==FAILURE && !fci->object_pp && (func_pos=strstr(function_name_lc, "::"))) { + int class_name_lc_len = (int)(func_pos - function_name_lc); + char *class_name_lc = estrndup(function_name_lc, class_name_lc_len); + zend_class_entry **ce; + + success = zend_lookup_class(class_name_lc, class_name_lc_len, &ce TSRMLS_CC); + + efree(class_name_lc); + if (success == SUCCESS) { + int func_len = fci->function_name->value.str.len - class_name_lc_len - 2; + func_pos += 2; + fci->function_table = &(*ce)->function_table; + calling_scope = *ce; + fci->object_pp = NULL; + success = zend_hash_find(fci->function_table, func_pos, func_len + 1, (void **) &EX(function_state).function); + } + } + + if (success==FAILURE) { /* try calling __call */ if (calling_scope && calling_scope->__call) { EX(function_state).function = calling_scope->__call; Index: php-src/ext/sockets/sockets.c diff -u php-src/ext/sockets/sockets.c:1.153 php-src/ext/sockets/sockets.c:1.154 --- php-src/ext/sockets/sockets.c:1.153 Sun Aug 31 16:45:48 2003 +++ php-src/ext/sockets/sockets.c Fri Oct 24 14:24:28 2003 @@ -19,7 +19,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: sockets.c,v 1.153 2003/08/31 20:45:48 iliaa Exp $ */ +/* $Id: sockets.c,v 1.154 2003/10/24 18:24:28 helly Exp $ */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -107,17 +107,6 @@ ZEND_ARG_PASS_INFO(1) ZEND_ARG_PASS_INFO(0) ZEND_ARG_PASS_INFO(0) - ZEND_ARG_PASS_INFO(1) - ZEND_ARG_PASS_INFO(1) - ZEND_END_ARG_INFO(); - -static - ZEND_BEGIN_ARG_INFO(third_through_seventh_args_force_ref, 0) - ZEND_ARG_PASS_INFO(0) - ZEND_ARG_PASS_INFO(0) - ZEND_ARG_PASS_INFO(1) - ZEND_ARG_PASS_INFO(1) - ZEND_ARG_PASS_INFO(1) ZEND_ARG_PASS_INFO(1) ZEND_ARG_PASS_INFO(1) ZEND_END_ARG_INFO();
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php