我对PHP比较陌生,我正在寻找一种方法,可以从多个PHP脚本中定义整个项目中可以全局访问的某些对象。
在Java中,如果我要全局访问某些对象,我会定义一些名为Globals
的公共类,并在{{{x>}中定义我需要访问的对象 static 1}}类。然后,我随时随地访问这些对象:Globals
。
基本上,我只需要初始化这些全局对象一次,然后在需要时使用它们。
一个用例:
我有一个名为Globals.variable_name
的类,它具有在日志文件中记录某些事件的方法。我需要有一个Logger
实例/对象,只要他们要记录某些东西,就可以被项目中的所有PHP脚本使用。我宁愿不让每个PHP脚本使用它自己的Logger
实例。
我试过的朴素的Java式方法,但没有用:
我在一个单独的PHP文件(名为Globals.php)中创建了一个名为Logger
的公共类,其中包含一个类型为Globals
的静态对象,名为Logger
。我把这个PHP文件包含在我需要这个$logHandle
对象的所有其他PHP文件中。然后,我尝试使用其他PHP脚本中的Logger
来访问此对象。这次尝试失败了。
是否有类似的方法?
感谢。
答案 0 :(得分:6)
在Web应用程序中,为每个请求初始化PHP环境 - 并且每个请求都在具有自己的内存空间的不同进程中处理。可以跨不同实例共享对数据(包括序列化对象,但不包括数据库连接和文件句柄等资源)的访问。您可能已经知道这一点,但尚未意识到它会如何影响您编写代码的方式。
我宁愿不让每个PHP脚本使用它自己的Logger实例
为什么不呢?
一个很好的理由是允许多个进程写入同一个打开的文件句柄需要锁定以防止文件全部被搞砸。但这是PHP - 停止从SCRATCH重新开始。写入stderr会将详细信息附加到Web服务器错误日志或使用操作系统syslog工具 - 这就是他们的用途。
不可能让所有PHP实例都有相同的对象 - 你可以在所有实例中反序列化一个对象 - 但它不是同一个对象。您可以使用单个对象运行守护程序,该对象可以通过套接字连接访问所有其他PHP实例 - 但它不在相同的地址空间中运行。
如果您有效地拥有一个您希望通过具有固定名称的对象普遍可用的类,则只需在每个脚本中或通过包含文件创建该对象的实例。您尝试的方法是解决此问题的方法(但不要用保留字命名对象)。我们不知道为什么它失败了,因为您没有提供任何错误消息或代码。
答案 1 :(得分:1)
<?php
class Logger {
public static function log($msg) {
// ...
}
}
你可以像
一样使用它Logger::log($msg);
答案 2 :(得分:1)
我假设你在询问常见情况(现在只是面向网络的应用程序)。为此 - 不,你不能用 native 方式定义像你所描述的那样的东西。这就是PHP中的superglobals。
但另一方面 - 你需要出于某种原因这样做,而不是&#34;只是因为你想要它&#34; 。如果是这样 - 那么使用配置文件。创建一些应用程序配置文件,在应用程序启动时读取一次(bootstrap),然后您将获得所有需要的值。我没有说文件结构 - 它可以是xml / ini / yaml / whatever / you / like。但这个想法是 - 从应用程序结构本身拆分这个逻辑,并使用单独的文件来存储所需的值。
另一种选择是使用一些单独的PHP文件并将其包含在bootstrap中。定义该文件中所有需要的变量/常量,您将获得类似的行为。请注意,就命名空间而言,它更少&#34;全球&#34;并且您需要手动解决所有这些情况。
但是,对于Web应用程序,可能的解决方案之一可能是使用sessions。 $_SESSION
是一个超全局数组,它的行为与你想要的一样(即可以从任何地方访问)。但这并不总是适用 - 并不总是你想要处理会话来存储与会话无关的数据。
答案 3 :(得分:0)
http://www.php.net/manual/en/reserved.variables.globals.php
我认为这就是你所追求的目标。
答案 4 :(得分:0)
要在PHP中访问静态属性,您需要使用Class::$attribute
表示法调用它,并且需要使用Class::method()
表示法调用静态方法。
调用类实例的属性时使用->
表示法。