PHP:使用我班级中外部文件的变量

时间:2014-05-03 01:15:44

标签: php oop scope

我有一个 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;

    }
}

2 个答案:

答案 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');

这可能比将配置传递到每个类更容易,但是将配置替换为测试目的更加困难。