有没有办法在PHP中使用* .properties文件,就像在Java中一样?我想在属性或XML文件中存储一些应用程序级常量,并在我的代码中轻松调用它们。非常感谢您的指导。感谢。
答案 0 :(得分:17)
PHP可以使用parse_ini_file()
本地加载和解析.ini
个文件。
您还可以使用define()
在包含文件中设置常量。
如果您设置了XML,请查看PHP的XML功能。最简单的解决方案可能是使用SimpleXML。
答案 1 :(得分:7)
您还可以使用包含数组的PHP文件来存储数据。 例如:
的config.php
<?php
return array(
'dbhost' => 'localhost',
'title' => 'My app'
);
然后在另一个文件中:
$config = require 'config.php':
echo $config['title'];
答案 2 :(得分:6)
parse_ini_file
与Java环境中的*.properties
文件无关。
我创建了这个函数,它与Java中的等价函数完全相同:
function parse_properties($txtProperties) {
$result = array();
$lines = split("\n", $txtProperties);
$key = "";
$isWaitingOtherLine = false;
foreach($lines as $i=>$line) {
if(empty($line) || (!$isWaitingOtherLine && strpos($line,"#") === 0)) continue;
if(!$isWaitingOtherLine) {
$key = substr($line,0,strpos($line,'='));
$value = substr($line,strpos($line,'=') + 1, strlen($line));
} else {
$value .= $line;
}
/* Check if ends with single '\' */
if(strrpos($value,"\\") === strlen($value)-strlen("\\")) {
$value = substr($value, 0, strlen($value)-1)."\n";
$isWaitingOtherLine = true;
} else {
$isWaitingOtherLine = false;
}
$result[$key] = $value;
unset($lines[$i]);
}
return $result;
}
此功能首先是posted on my blog。
答案 3 :(得分:3)
好吧,你可以完美地将一些配置放在属性文件中并自己进行解析。但在PHP中,它并不是适当的格式。
我会定义一些常量并将它们放在一个单独的php配置文件(如config.php)中,并在需要的地方包含它。
其他选项是将配置实际放入xml文件中并使用xml library读取它。 YAML(php.net)也是简单易读配置的常用选项。
答案 4 :(得分:2)
据我所知,没有PHP内置函数来读取和处理.properties文件。如果您在PHP中编写的应用程序需要读取Java .properties文件,则需要通过读取文件并创建自己的.properties解析器来编写自己的解决方案。
否则,如此处其他成员所提到的,您可以将配置信息存储到.ini文件中。 PHP提供了加载和解析.ini文件的本机函数。
如果您愿意,可以使用PHP XML解析器(PHP Manual Function Reference XML Manipulation)将信息存储到XML文件中。
就个人而言,我更喜欢将配置/应用程序常量值存储到数组中。我创建了一个处理配置文件的Configuration类。
这里有一个例子:
配置文件示例(例如:config.php)
<?php
// Typical configuration file
$config['database']['type'] = 'mysql';
$config['database']['host'] = 'localhost';
$config['database']['username'] = 'root';
$config['database']['password'] = 'your_password';
$config['database']['database'] = 'your_project';
$config['date']['timezone'] = 'America/Montreal';
?>
课程配置
<?php
class Configuration
{
protected $configuration;
function __construct($filename)
{
// CFG_PATH : i.e --> define('CFG_PATH',dirname(__FILE__) . '/cfg/');
require(CFG_PATH . $filename);
$this->setConfiguration($config);
}
public function getConfiguration($configuration)
{
return $this->configuration[$configuration];
}
public function setConfiguration($configuration)
{
$this->configuration = $configuration;
}
}
?>
典型用法示例
<?php
// Your class definitions, variables, functions...
function __construct() {
$this->configuration = new Configuration(CFG_FILE);
$this->set_Timezone($this->configuration->getConfiguration('date'));
}
private function set_Timezone($configuration)
{
date_default_timezone_set($configuration['timezone']);
}
?>
其他示例(Controller和DAO)
<强>控制器强>
<?php
protected function doPost() {
...
$configuration = new Configuration(CFG_FILE);
$dao = new DAO($configuration->getConfiguration('database'));
...
}
?>
DAO示例
<?php
function __construct($configuration) {
// Build DSN (Data Source Name) string
if ($configuration['type'] == 'mysql') {
$this->dsn = '(type):host=(host);dbname=(database);charset=UTF8';
$this->dsn = str_replace('(type)', $configuration['type'], $this->dsn);
$this->dsn = str_replace('(host)', $configuration['host'], $this->dsn);
$this->dsn = str_replace('(database)', $configuration['database'], $this->dsn);
$this->options = array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\'');
try
{
$this->databaseHandle = new PDO($this->dsn, $configuration['username'], $configuration['password'], $this->options);
}
catch (PDOException $e)
{
...
}
}
else
{
...
}
}
?>
如果您在Java中使用Spring框架并且您想在PHP中使用类似的messages.properties解决方案,则可以调整上面提到的相同解决方案。当然,行为不会与Java相同,但是,使用Locale类,您可以根据客户端所在的位置创建处理PHP应用程序中的消息/标签的函数。
使用基于数组的这种解决方案,我认为这将帮助您在应用程序中定义所需的值并组织配置数据。当然,还有很多其他方法可以达到这个目的,但我认为解决方案是有效的。
答案 5 :(得分:1)
在PHP .ini文件中提供几乎相同的功能。有一些简单的方法可以从这些文件中读取常量。
此外,大多数PHP框架都使用扩展名为.php。
的配置文件来实现它例如在cake php中我们有Configure类,它提供类似Configure :: read('VarName')和Configure :: write('VarName',VarValue);
一旦编写,就可以在文件包含范围内访问。
答案 6 :(得分:1)
function getLocale($file){
$locales = array();
$accessible = fopen($file, "r");
if (!$accessible) return null;
while (($line = fgets($accessible)) !== false) {
$pos = strpos($line, '=');
if (!$pos) continue;
$name = substr($line, 0, $pos);
$value = substr($line, $pos + 1, strlen($line));
$locales[$name] = $value;
}
return $locales;
}
getLocale('lang/eng.properties');