PHP NEWS
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
?? Oct 2008, PHP 5.2.7RC2
+- Fixed bug #46246 (difference between call_user_func(array($this, $method))
+ and $this->$method()). (Dmitry)
- Fixed bug #44251, #41125 (PDO + quote() + prepare() can result in seg fault).
(tsteiner at nerdclub dot net)
--- /dev/null
+--TEST--
+Bug #46246 (difference between call_user_func(array($this, $method)) and $this->$method())
+--FILE--
+<?php
+class A
+{
+ private function Test()
+ {
+ echo 'Hello from '.get_class($this)."\n";
+ }
+
+ public function call($method, $args = array())
+ {
+ $this->Test();
+ $this->$method();
+ call_user_func(array($this, $method));
+ }
+}
+
+class B extends A
+{
+ protected function Test()
+ {
+ echo 'Overridden hello from '.get_class($this)."\n";
+ }
+}
+
+$a = new A;
+$b = new B;
+
+$a->call('Test');
+$b->call('Test');
+?>
+--EXPECT--
+Hello from A
+Hello from A
+Hello from A
+Hello from B
+Hello from B
+Hello from B
}
EX(function_state).function =
Z_OBJ_HT_PP(fci->object_pp)->get_method(fci->object_pp, fname, fname_len TSRMLS_CC);
- if (EX(function_state).function && calling_scope != EX(function_state).function->common.scope) {
+ if (EX(function_state).function &&
+ (EX(function_state).function->common.fn_flags & ZEND_ACC_PRIVATE) == 0 &&
+ calling_scope != EX(function_state).function->common.scope) {
char *function_name_lc = zend_str_tolower_dup(fname, fname_len);
if (zend_hash_find(&calling_scope->function_table, function_name_lc, fname_len+1, (void **) &EX(function_state).function)==FAILURE) {
efree(function_name_lc);