众所周知,可以在不实例化类的情况下调用静态方法。所以我想知道在使用静态方法之前是否会将其加载到内存中。如果是这样,在我看来,我应该使用更多的intance方法而不是太多的静态方法。有人建议吗?我不熟悉PHP的基本机制。
答案 0 :(得分:3)
所以我想知道在使用静态方法之前是否会将其加载到内存中。
加载类时,始终加载所有方法。无论这些方法是类方法还是实例方法,或者它们是否被应用程序使用,都会发生这种情况。
使用最适合您设计的任何类型的方法。
答案 1 :(得分:1)
静态方法只是一个具有花哨名称的常规函数(如果不是public
,则为受限访问)。
静态方法不是OOP,它们是伪装的程序代码。
我应该避免在PHP中使用太多静态方法吗?
这取决于你认为有多少"太多" 。对于纯OOP代码,一个静态方法已经"太多" 。但有时为某些功能编写静态方法是不可避免的(阅读"更容易" )。
所以我想知道在使用静态方法之前是否会将其加载到内存中。
无论您是使用CLI运行PHP脚本还是通过Web服务器调用它来提供网页,脚本文本都会加载到内存中并进行编译。如果编译成功(即没有语法错误),则解释器开始执行它。
此时脚本中定义的所有内容都已在内存中,但仅限于主脚本中定义的项目。包含语句(include
,include_once
,require
,require_once
)在编译阶段不会被处理。
include
语句引用的文件在内存中加载,编译并执行,和时,在执行脚本期间到达include
语句。无论包含函数,类还是全局代码,包含文件的整个内容都会被加载,解析并转换为操作码。从这个角度来看,实例方法和静态方法之间没有区别。
答案 2 :(得分:1)
我使用了很多静态方法。
我是高级php开发人员,我总是试图让我的代码非常有条理地为我的后辈保留,所以我倾向于将所有逻辑保留在一个类中并使用静态函数来处理所有废话(设置代码)。
示例:
在处理权限时,我倾向于这样做:
ACL::userCanUpdatePost($user,$post);
发送电子邮件或消息时
Mail::send($from,$to,$template,$data);
在每个内部我处理创建,验证,异常等。
你可以称之为Facade,如果你将它用作提高可读性和组织内容的工具,那么这样做会很好。总是尝试建立小班,外墙将帮助你实现这一目标。 如果您对其他方法有好处,可以查找Application Container和Dependency Injection。
这里没有一线希望,所有这些都是免费的,所有这些都是对的,这取决于你如何使用它。
答案 3 :(得分:0)
我应该使用更多的intance方法而不是太多的静态方法。 有人建议吗?
有时你需要定义一个静态方法,如果你需要调用它而不创建该类的对象,但这应该是有限的。
何时使用静态方法:
您可以使用静态方法作为工厂根据上下文创建对象或与其他实例共享资源。
如果与您的目的和实例没有关系
如果您打算使用公共静态属性,我建议您在某些情况下使用CONST
,除非您不想更改其值。
<强>为什么吗
Consts位于类和对象范围内,并且它始终是不可变的(您无法更改其值),并且可以安全使用。
静态属性不在对象范围内,而是在类范围及其可变性(可以更改)上,并且不安全使用。
另外,您可以查看Singleton pattern以了解如何在资源共享上使用静态方法。