# is_a() triggers __autoload() in 5.3.7

- Thread: https://externals.io/message/54766
- Original archive: https://news-web.php.net/php.internals/54766
- Started by Mads Lie Jensen on 2011-08-22T05:48:14+00:00
- Messages: 9
- Reply by email to internals@lists.php.net
- More for agents: search with https://externals.io/search.md?q={query} · JSON API at https://externals.io/api · documentation at https://externals.io/llms.txt

---

## #54766 — Mads Lie Jensen — 2011-08-22T05:48:14+00:00

URL: https://externals.io/message/54766#54766

Hi.

After upgrading to php 5.3.7, whenever I use is_a($object, 'ClassName');
the autoloader of classes is now called.

This did not happen in earlier versions of php 5.3 that I used before.
But I cannot find any  mention of it anywhere, no open bugs for it, and
nothing in the changelogs.

Is it a bug or is it intentional that it has started behaving this way?

-- 
Mads Lie Jensen - mads@gartneriet.dk - ICQ #25478403
Gartneriet - http://www.gartneriet.dk/

---

## #54767 — Kalle Sommer Nielsen — 2011-08-22T06:10:28+00:00

URL: https://externals.io/message/54766#54767 · In reply to: #54766

Hi

2011/8/22 Mads Lie Jensen <mads@gartneriet.dk>:
> Hi.
>
> After upgrading to php 5.3.7, whenever I use is_a($object, 'ClassName');
> the autoloader of classes is now called.
>
> This did not happen in earlier versions of php 5.3 that I used before.
> But I cannot find any  mention of it anywhere, no open bugs for it, and
> nothing in the changelogs.
>
> Is it a bug or is it intentional that it has started behaving this way?

I'm unable to reproduce your case in 5.3.4RC1, 5.3.7 and 5.3-svn:
http://pastie.org/2410070

Please open a bug report [1] and attach a script to reproduce the
behaviour you are seeing (should be a 10 liner script for this
incident)

[1] http://bugs.php.net/

-- 
regards,

Kalle Sommer Nielsen
kalle@php.net

---

## #54771 — Hannes Magnusson — 2011-08-22T08:00:11+00:00

URL: https://externals.io/message/54766#54771

> On Mon, 22 Aug 2011 08:10:28 +0200, kalle@php.net (Kalle Sommer Nielsen)
> wrote:
>
> > […]
>
> Ah, I now see that it only happens when trying to check something which
> is not actually an object:
>
> <?php
>
> function __autoload($class) {
>        echo "Would load: " . $class . PHP_EOL;
> }
>
> $var = "test";
> var_dump(is_a($var, 'B'));
>
> $obj = new Stdclass;
> var_dump(is_a($obj, 'C'));
>
> ?>
>
> But still, it did not happen in earlier phpversions.


I can reproduce that in 5.3-svn and 5.4-svn.

Please file a bug report for it, this should probably be fixed in 5.3.8 too.

-Hannes

---

## #54775 — Mads Lie Jensen — 2011-08-22T08:17:32+00:00

URL: https://externals.io/message/54766#54775 · In reply to: #54771

On Mon, 22 Aug 2011 10:00:11 +0200, hannes.magnusson@gmail.com (Hannes
Magnusson) wrote:

>I can reproduce that in 5.3-svn and 5.4-svn.
>
>Please file a bug report for it, this should probably be fixed in 5.3.8 too.

Done: 

Bug #55475  `is_a()` triggers autoloader
-- 
Mads Lie Jensen - mads@gartneriet.dk - ICQ #25478403
Gartneriet - http://www.gartneriet.dk/

---

## #54776 — Etienne Kneuss — 2011-08-22T08:20:26+00:00

URL: https://externals.io/message/54766#54776

Hi,


> On Mon, 22 Aug 2011 08:10:28 +0200, kalle@php.net (Kalle Sommer Nielsen)
> wrote:
>
> > […]
>
> Ah, I now see that it only happens when trying to check something which
> is not actually an object:
>
> <?php
>
> function __autoload($class) {
>        echo "Would load: " . $class . PHP_EOL;
> }
>
> $var = "test";
> var_dump(is_a($var, 'B'));
>
> $obj = new Stdclass;
> var_dump(is_a($obj, 'C'));
>
> ?>
>
> But still, it did not happen in earlier phpversions.
Here is the situation:

1) The underlying implementation is shared between is_a and is_subclass_of.
2) Previously, strings as first argument was not permitted by is_a but
was for is_subclass_of,
3) is_subclass_of always triggered autoload in such cases.
4) Following a fix from Dmitry, the underlying implementation now
allows a string as first argument for is_a as well.

Conclusion: it is now consistent, but if you wrongly used is_a with a
string before, it now triggers autoload because it actually accepts
it.

Best,

> --
> Mads Lie Jensen - mads@gartneriet.dk - ICQ #25478403
> Gartneriet - http://www.gartneriet.dk/
>
> --
> 
> 
>
>



-- 
Etienne Kneuss
http://www.colder.ch

---

## #54790 — Kalle Sommer Nielsen — 2011-08-22T10:33:57+00:00

URL: https://externals.io/message/54766#54790 · In reply to: #54775

2011/8/22 Mads Lie Jensen <mads@gartneriet.dk>:
> On Mon, 22 Aug 2011 10:00:11 +0200, hannes.magnusson@gmail.com (Hannes
> Magnusson) wrote:
>
> > […]
>
> Done:
>
> Bug #55475      is_a() triggers autoloader

I have attached a simple one liner patch to the report, which like
Hannes said, should go into 5.3.8 to keep BC.

-- 
regards,

Kalle Sommer Nielsen
kalle@php.net

---

## #54795 — Ilia Alshanetsky — 2011-08-22T13:12:14+00:00

URL: https://externals.io/message/54766#54795 · In reply to: #54790

The fix looks good, Dmitry can you please review it, if it is good
let's get it into 5.3.8


> 2011/8/22 Mads Lie Jensen <mads@gartneriet.dk>:
> > […]
>
> I have attached a simple one liner patch to the report, which like
> Hannes said, should go into 5.3.8 to keep BC.
>
> --
> regards,
>
> Kalle Sommer Nielsen
> kalle@php.net

---

## #54797 — Etienne Kneuss — 2011-08-22T13:23:04+00:00

URL: https://externals.io/message/54766#54797 · In reply to: #54795

The actual question is whether the "fix" makes sense or not in the first place.

Please debate in the bug report directly to avoid a schizophrenic discussion.

Best,


> The fix looks good, Dmitry can you please review it, if it is good
> let's get it into 5.3.8
>
> 
> > […]
>
> --
> 
> 
>
>



-- 
Etienne Kneuss
http://www.colder.ch

---

## #54802 — Stas Malyshev — 2011-08-22T18:38:42+00:00

URL: https://externals.io/message/54766#54802

Hi!


> Ah, I now see that it only happens when trying to check something which
> is not actually an object:
>
> <?php
>
> function __autoload($class) {
> 	echo "Would load: " . $class . PHP_EOL;
> }
>
> $var = "test";
> var_dump(is_a($var, 'B'));
>
> $obj = new Stdclass;
> var_dump(is_a($obj, 'C'));
>
> ?>

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.
-- 
Stanislav Malyshev, Software Architect
SugarCRM: http://www.sugarcrm.com/
(408)454-6900 ext. 227
