Why shouldn't I use UNIVERSAL::isa?

前端 未结 7 1008
终归单人心
终归单人心 2021-02-07 07:58

According to this

http://perldoc.perl.org/UNIVERSAL.html

I shouldn\'t use UNIVERSAL::isa() and should instead use $obj->isa() or CLASS->isa().

This means

7条回答
  •  北恋
    北恋 (楼主)
    2021-02-07 08:32

    The primary problem is that if you call UNIVERSAL::isa directly, you are bypassing any classes that have overloaded isa. If those classes rely on the overloaded behavior (which they probably do or else they would not have overridden it), then this is a problem. If you invoke isa directly on your blessed object, then the correct isa method will be called in either case (overloaded if it exists, UNIVERSAL:: if not).

    The second problem is that UNIVERSAL::isa will only perform the test you want on a blessed reference just like every other use of isa. It has different behavior for non-blessed references and simple scalars. So your example that doesn't check whether $ref is blessed is not doing the right thing, you're ignoring an error condition and using UNIVERSAL's alternate behavior. In certain circumstances this can cause subtle errors (for example, if your variable contains the name of a class).

    Consider:

    use CGI;
    
    my $a = CGI->new();
    
    my $b = "CGI";
    
    print UNIVERSAL::isa($a,"CGI");  # prints 1, $a is a CGI object.
    print UNIVERSAL::isa($b,"CGI");  # Also prints 1!! Uh-oh!!
    

    So, in summary, don't use UNIVERSAL::isa... Do the extra error check and invoke isa on your object directly.

提交回复
热议问题