Perl:静态与包方法

Perl:静态与包方法,perl,static,package,Perl,Static,Package,我需要创建一个包,将由其他开发人员使用。 实现静态方法的最佳方式是什么? 对于静态(类)方法,我必须期望第一个参数$class,并且方法必须作为类方法调用: My::Package->Sub1(); 从另一方面来说,我可以编写一个“常规”包子例程(不需要$class参数),它将完美地完成相同的工作,但需要以不同的方式调用 My::Package::Sub1(); 因此,从业务功能的角度来看,基本上没有什么不同(至少我看不到,除了第一个参数中的包名可用性),但是有两种不同的实现和调用方法

我需要创建一个包,将由其他开发人员使用。 实现静态方法的最佳方式是什么? 对于静态(类)方法,我必须期望第一个参数$class,并且方法必须作为类方法调用:

My::Package->Sub1();
从另一方面来说,我可以编写一个“常规”包子例程(不需要$class参数),它将完美地完成相同的工作,但需要以不同的方式调用

My::Package::Sub1();
因此,从业务功能的角度来看,基本上没有什么不同(至少我看不到,除了第一个参数中的包名可用性),但是有两种不同的实现和调用方法。有点困惑。 我应该使用哪种方式以及何时使用?有什么规定吗?
另外,我是否应该检查方法是否按我预期的那样被调用(静态vs包)?

首先,一个功能点:如果创建了从
My::package
继承的第二个类,
Child::Class::Sub1()
将是未定义的,如果
Sub1
是作为非OO子例程编写的,
Child::Class->Sub1()
将忽略从
Child::Class
调用它的事实

因此,为了让程序员使用您的模块,您需要使包/类中的所有子例程响应一致的调用结构/方法。您的模块应该是一个子程序/函数库,或者是一个充满方法的类。如果它的一部分是OO,那么就把它全部变成OO。可以创建在混合模式下运行的子例程,但这不必要地使代码复杂化,并且在CPAN上似乎已经过时

现在,如果确实没有理由区分
My::Package->Sub1()
Child::Class->Sub1()
,那么您可以随意忽略将传递的隐式类名参数。这并不意味着您不应该期望该参数,也不意味着您应该鼓励在OO模块中使用非OO调用格式