Greg Beaver wrote:
> Marcus Boerger wrote:
>> Hello Scott,
>>
>>   actually it was a bug. We, sorry I, did not spot this in earlier versions.
>> Now saying you rely on a bug in PHP 5 to be able to execute PHP 4 code
>> simply does not work.
> 
> Hi Marcus,
> 
> How is forcing users to replace call_user_func(array('Classname', 
> 'func')) with eval('Classname::func') a good policy?
> 
> When this example code:
> 
> <?php
> error_reporting(E_NOTICE|E_WARNING|E_ERROR);
> class A { function B (){}}
> A::B();
> ?>
> 
> functions differently from this code:
> 
> <?php
> error_reporting(E_NOTICE|E_WARNING|E_ERROR);
> class A { function B (){}}
> call_user_func(array('A','B'));
> ?>
> 
> And in a minor version increment, this in fact introduces a bug, and 
> doesn't fix one.
> 
> I think the fix may be to simply add retval=0 in 
> zend_is_callable_check_func() here:
> 
>                               if ((check_flags & IS_CALLABLE_CHECK_IS_STATIC) 
> != 0) {
>                                       retval = 0;
>                               } else {
>                                       if (EG(This) && 
> instanceof_function(Z_OBJCE_P(EG(This)), *ce_ptr 
> TSRMLS_CC)) {
>                                               *zobj_ptr_ptr = &EG(This);
>                                               zend_error(E_STRICT, 
> "Non-static method %s::%s() cannot be called 
> statically, assuming $this from compatible context %s", (*ce_ptr)->name, 
> fptr->common.function_name, Z_OBJCE_P(EG(This))->name);
>                                       } else {
>                                               zend_error(E_STRICT, 
> "Non-static method %s::%s() cannot be called 
> statically", (*ce_ptr)->name, fptr->common.function_name);
>                                       }
>                               }
> 
> basically what is happening is that E_STRICT makes the callback invalid, 
> which is not technically true - the callback is valid, just not strictly 
> correct.
> 
> I can make a patch next week, if someone doesn't beat me to it.  We need 
> a retval=0 in the inner else clause

Yes, I agree that we need to be consistent here.

  error_reporting(E_ALL|E_STRICT);
  class foo { function bar() { echo "gah"; } }
  call_user_func('foo::bar');
  foo::bar();

This needs to throw an E_STRICT in both cases.  Right now we get an
E_WARNING and the call doesn't work for the first, and an E_STRICT for
the second.  Having these behave differently makes no sense.

And likewise, is_callable('foo::bar') should return true.

-Rasmus

-- 
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to