Alan,

I think this feature can certainly be useful, but either way, but again, unless 
I'm misunderstanding you - you're defining new functionality (support for new 
types of a first argument) as a BC break.  I don't think it's realistic to look 
at it this way.

And I do think that it's useful, assuming you don't have typos and ask about 
non-existent classes, or have a broken autoloader - this will work as expected 
and return true/false properly.

Zeev
 
> -----Original Message-----
> From: a...@akbkhome.com [mailto:a...@akbkhome.com]
> Sent: Wednesday, August 24, 2011 2:35 PM
> To: Zeev Suraski
> Cc: internals@lists.php.net
> Subject: Re: [PHP-DEV] PHP 5.3.8 Released!
> 
> It's not really a bug fix, as the document for is_a() never said it would 
> support
> 'mixed' first argument. (is_subclass_of is different, it currently says mixed 
> as
> the first argument). If it needed fixing, then support for strings should have
> been removed, rather than added.
> 
> The problem I have is that this 'feature' is not really that usefull, to 
> anyone
> AFAIKS. (why would you realistically want to do that kind of
> check?) and if you really did need to do such a test, there are other trivial
> ways to do it already (which work across versions).
> 
> I know it's reusing code at the backend, but it's a trivial change to remove 
> the
> BC break, and it does not break anything else. (nobody would have used it that
> way yet..).
> 
> Regards
> Alan
> 
> On Wednesday, August 24, 2011 06:43 PM, Zeev Suraski wrote:
> > I think there are two ways to look at it:
> >
> > - As a new feature.  If I understand you correctly, the fact that beforehand
> is_a() was documented to only return TRUE in case the first argument was an
> instance of the second argument, means that if we do anything beyond that -
> e.g. support strings as the first argument - this means we break compatibility
> (please correct me if I misunderstood).  IMHO that's not a realistic way to 
> look
> at retaining compatibility, and I'm saying that as someone who's almost
> religious about maintain compatibility.  With that view of the world, almost
> every bug fix and literally every feature we add - breaks compatibility.
> >
> > - As a bug fix.  Strings were supported even before this change, but they
> weren't working properly or consistently with the way classes work
> everywhere else in PHP.  That was fixed.  Just so that we feel good about
> ourselves, we also changed undocumented behavior.  In case it's not clear, a
> situation where is_a("bar", "foo") returns FALSE, even though bar extends foo,
> but bar simply doesn't happen to be loaded in memory at the time of the call -
> can lead to very real world bugs.
> >
> > Zeev
> >
> >> -----Original Message-----
> >> From: a...@akbkhome.com [mailto:a...@akbkhome.com]
> >> Sent: Wednesday, August 24, 2011 12:37 PM
> >> To: internals@lists.php.net
> >> Subject: Re: [PHP-DEV] PHP 5.3.8 Released!
> >>
> >> Since when has changing documented behaviour and breaking a large
> >> number of applications been acceptable? (Well, happens occasionally
> >> by accident ..)
> >>
> >> This was a 'feature change' to is_a(), it was documented as _only_
> >> returning 'TRUE' when an object was passed as the first object and it
> >> was an instance of that...
> >>
> >> I did read through the previous posts, (just caught up the other
> >> day), it looks like if anybody really need to do what this new
> >> feature provides, (which is probably very rare), then
> >>
> >> $left == $right || is_subclass_of($left,$right)
> >>
> >> should work fine without breaking any code.
> >>
> >> Regards
> >> Alan
> >>
> >> On Wednesday, August 24, 2011 03:44 PM, Ferenc Kovacs wrote:
> >>> On Wed, Aug 24, 2011 at 3:57 AM,
> >> a...@akbkhome.com<a...@akbkhome.com>   wrote:
> >>>> It might have been better to have waited for the is_a() fix to get
> >>>> sorted out.. - It's a very annoying BC break (changes the
> >>>> documented behaviour), and now it means we need 4.3.9 in a few more
> days.
> >>>>
> >>>> Let me know if you need help testing / applying etc..
> >>>>
> >>> from what I understand, this won't be changed, as the current
> >>> behavior is correct, the old was a bug:
> >>>
> >>> as Stas pointed out:
> >>> "Not a bug. $var is interpreted as a class name. To know if one
> >>> class extends another, the class in question (first one) should be loaded.
> >>> There's no need to load the second one since if it's unknown nothing
> >>> can be instance of it and existing classes can not extend it."
> >>> if you used this previously
> >>>
> >>> from Dmitry:
> >>> "Before the patch, is_a() didn't accept string as the first argument
> >>> at all, so it always returned "false" and never triggered
> >>> __autoload(). The proposed patch didn't revert to original behavior.
> >>> It just disables autoloading and may lead to wrong result.
> >>>
> >>> class a {}
> >>> class b extends a {}
> >>> var_dump(is_a("b", "a")); // it was false before 5.3.7, now it's
> >>> true
> >>>
> >>> I would say that the old behaviour was wrong, especially because
> >>> "instanceof" and is_subclass_of() already implemented support for
> >>> string arguments."
> >>>
> >>> so your example was bogus, as passing a non-object as a first
> >>> parameter wasn't supported (see http://php.net/is_a) so your code
> >>> example depends on an undefined behavior and results in a bogus
> >>> result
> >>> (is_a() alwas returned false if you passed a non-object)
> >>>
> >>> so in a way it is really a BC, but I think that this change is really a 
> >>> bugfix.
> >>>
> >>
> >> --
> >> PHP Internals - PHP Runtime Development Mailing List To unsubscribe,
> visit:
> >> http://www.php.net/unsub.php

Reply via email to