我有一个 settings.php 文件,如下所示:
$user="adam";
$pass="something";
然后我有一个名为 funcs.php 的课程,其中我有一个要求“../ settings.php”,但我不知道如何将“$ user”的范围纳入我的方法......
我确信这是一个简单的解决办法,但我一直在谷歌上搜索一段时间没有运气。
我的班级看起来像这样:
<?php
require_once __DIR__."/../settings.php";
class Funcs
{
public function something()
{
// do stuff
return $user;
}
}
答案 0 :(得分:2)
你可以在文件中使用return
构造,它可以返回任何内容,但如果你想返回多个值,最好使用数组。
的settings.php
return array(
'user' => 'adam',
'pass' => 'something'
);
file.php
$settings = require __DIR__.'settings.php';
echo $settings['user']; // adam
将从文件返回的所有内容传递给类:
class MyClass {
public function __construct(array $array) {
foreach($array as $key => $value) {
$this->{$key} = $value;
}
}
}
$class = new MyClass(require __DIR__ . '/settings.php');
var_dump($class);
/*
class MyClass#1 (2) {
public $user =>
string(4) "adam"
public $pass =>
string(9) "something"
}
*/
答案 1 :(得分:2)
我认为问题在于这些是在函数或类范围内使用的全局变量。
如果您想在功能范围内访问这些内容,可以使用&#34; global&#34;关键字,例如:
public function foo() {
global $user;
echo $user;
}
然而 - 现在使用全局(以及一般的全局变量)通常被认为是非常臭的。
一些替代方案:
将配置传递给类的构造函数,因此:
$config = array(
'user' => 'adam',
'pass' => 'something'
);
class MyConsumer {
private $config;
public function __construct($config) {
$this->config = $config;
}
}
$instance = new MyConsumer($config);
这通常被称为&#34;依赖注入&#34;,因为您的配置可以根据上下文(例如在单元测试中)轻松替换其他内容。
另一种方法是拥有一个singleton类来封装你的配置,你可以访问它(没有经过测试但是你明白了):
// production_config.php
return array(
'user' => 'adam',
'password' => 'something'
);
// config.php
class Config {
protected $config;
protected static $instance = null;
protected function __construct() {
$this->config = require('production_config.php');
}
protected function getKey($key) {
if(isset($this->config[$key])) {
return $this->config[$key];
}
// Possibly throw exception or something else if not found
}
public static function get($key) {
if(self::$instance === null) {
self::$instance = new self();
}
return self::$instance->getKey($key);
}
}
所以你可以去:
$user = Config::get('user');
这可能比将配置传递到每个类更容易,但是将配置替换为测试目的更加困难。