整个项目中的Php全局变量
我对PHP比较陌生,我正在寻找一种方法来定义某些对象,使其在整个项目中可以从多个PHP脚本全局访问 在Java中,如果我必须全局访问某些对象,我将定义一个名为整个项目中的Php全局变量,php,Php,我对PHP比较陌生,我正在寻找一种方法来定义某些对象,使其在整个项目中可以从多个PHP脚本全局访问 在Java中,如果我必须全局访问某些对象,我将定义一个名为Globals的公共类,并在Globals类中将需要访问的对象定义为static。然后,我可以使用:Globals.variable\u name在任何需要的地方访问这些对象 所以基本上,我只需要初始化这些全局对象一次,然后在需要时使用它们 一个用例: 我有一个名为Logger的类,它有将某些事件记录在日志文件中的方法。我需要1个Logge
Globals
的公共类,并在Globals
类中将需要访问的对象定义为static。然后,我可以使用:Globals.variable\u name
在任何需要的地方访问这些对象
所以基本上,我只需要初始化这些全局对象一次,然后在需要时使用它们
一个用例:
我有一个名为Logger
的类,它有将某些事件记录在日志文件中的方法。我需要1个Logger
instance/object,项目中的所有PHP脚本都可以使用它,只要它们需要记录一些东西。我不希望每个PHP脚本都使用自己的Logger
实例
我尝试过的类似Java的天真方法没有奏效:
我在一个单独的PHP文件(名为Globals.PHP)中创建了一个名为Globals
的公共类,其中有一个static对象,类型为Logger
,名为$logHandle
。我将这个PHP文件包含在我需要这个Logger
对象的所有其他PHP文件中。然后,我尝试使用另一个PHP脚本中的Globals->logHandle
访问这个对象。这一尝试惨遭失败
有类似的方法吗
谢谢。
我想这就是你想要的。要访问PHP中的静态属性,你需要用
类::$attribute
符号调用它,静态方法需要用类::方法()
符号调用
调用类实例的属性时使用->
符号。您可以这样做
您说过您已经在所有其他类中包含了将全局类中的方法更改为静态的方法
<?php
class Logger {
public static function log($msg) {
// ...
}
}
我假设您询问的是常见情况(现在只有面向web的应用程序)。对于这一点,不,你不能像你描述的那样,用自然的方式定义一些东西。这是PHP中调用的东西 但另一方面,你需要出于某种原因这样做,而不是“仅仅因为你想要”。如果是这样,则使用配置文件。创建一些应用程序配置文件,在应用程序启动(引导)时读取一次,您将获得所有需要的值。我没有说任何关于文件结构的内容——它可以是xml/ini/yaml/whatever/you/like。但其想法是——将此逻辑与应用程序结构本身分离,并使用单独的文件存储所需的值 另一个选择是使用一些单独的PHP文件,并将其包含在引导中。在该文件中定义所有需要的变量/常量,您将获得类似的行为。注意,就名称空间而言,它不是“全局的”,您需要手动解决所有这些情况 但是,对于web应用程序,可能的解决方案之一是使用
$\u SESSION
是一个超全局数组,它的行为将符合您的要求(即从任何地方都可以访问)。但这并不总是适用的——而且也不总是您希望处理会话来存储与会话无关的数据。PHP不是Java。
在web应用程序中,PHP环境针对每个请求进行初始化,每个请求在不同的进程中使用自己的内存空间进行处理。可以跨不同实例共享对数据的访问(包括序列化对象,但不能共享数据库连接和文件句柄等资源)。您可能已经知道这一点,但尚未意识到它如何影响您编写代码的方式
我不希望每个PHP脚本都使用自己的Logger实例
为什么不呢
一个很好的理由是,允许多个进程写入同一个打开的文件句柄需要锁定,以防止文件被完全阻塞。但这是PHP——停止从头开始重新发明东西。写入stderr会将详细信息附加到web服务器错误日志中,或者使用OS syslog工具——这就是它们的用途
不可能让同一个对象对所有PHP实例都可用—您可以在所有实例中取消序列化一个对象—但是它不是同一个对象。可以使用单个对象运行守护进程,其他所有PHP实例都可以通过套接字连接访问该对象,但它不在同一地址空间中运行
如果您有效地拥有一个类,并且希望通过具有固定名称的对象普遍可用,那么只需在每个脚本中或通过include文件创建该对象的实例即可。您尝试的方法就是这样做的(但不要用保留字命名对象)。我们不知道为什么失败,因为您没有提供任何错误消息或代码。相关-。尝试使用instead如果不在无法访问成员数据的页面上实例化对象,我建议在类Globals中使用静态变量,并在包含的文件中使用它们作为Globals::varname。请记住,在Java中,您的静态实例实际上是在不同的servlet之间共享的,因为它们运行在同一个VM中,而在PHP中,你可以共享定义和代码来创建实例,但你不能在脚本之间共享状态。我认为关键是在创建日志的代码中只保留一个位置,而不必到处编写
$logger=new logger()
。我从“将某些对象定义为可在整个项目中全局访问“实际上,我已经尝试了$GLOBALS
,但这也只能在一个脚本中起作用,跨越该脚本中的所有类;但不能跨越多个文件。我将尝试$\u SESSION
,但我认为这也将限制在一个脚本内。是的,我想作为最后手段,我必须使用一些外部设备
Logger::log($msg);