根据这个
http://perldoc.perl.org/UNIVERSAL.html
我不应该使用UNIVERSAL :: isa(),而应该使用$ obj-> isa()或CLASS-> isa()。
这意味着要找出某些东西是否是第一个参考,然后是这个类的引用,我必须要做
eval { $poss->isa("Class") }
并检查$ @和所有那些gumph,否则
use Scalar::Util 'blessed'; blessed $ref && $ref->isa($class);
我的问题是为什么UNIVERSAL :: isa是怎么回事?对于像
my $self = shift if UNIVERSAL::isa($_[0],__PACKAGE__)
解决方法
主要的问题是,如果直接调用UNIVERSAL :: isa,则绕过任何具有重载isa的类。如果这些类依赖于重载的行为(他们可能做的或者他们不会覆盖它),那么这是一个问题。如果你直接在你的祝福对象上调用isa,那么在这两种情况下都会调用正确的isa方法(如果存在则重载),UNIVERSAL ::如果不存在的话。
第二个问题是,UNIVERSAL :: isa只会像所有其他使用isa一样,在一个有福的参考中执行你想要的测试。它对于非保佑的引用和简单的标量具有不同的行为。所以你没有检查$ ref是否有福的例子是没有做正确的事情,你忽略错误条件并使用UNIVERSAL的备用行为。在某些情况下,这可能会导致微妙的错误(例如,如果变量包含类的名称)。
考虑:
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!!