正确的方法来创建一个类的set方法

时间:2016-02-06 13:32:56

标签: php class singleton

我在通过单元测试时遇到了麻烦。问题是set方法创建了索引,但我不知道如何返回true值。我真的不知道如何为这个特定的单元测试正确创建一个set方法。

<?php

class Config
{
private  static $instance;
public static $config;


private static function load($data) {
    $data = include('data.php');
    static::$config = $data;
    return static::$config;
}

// constructor
protected function _construct(){}

private  function _clone(){}

private function _wakeup() {}

// function to get the instance config
public static function singleton(){
    /**
     *  Returns single instance of this class
     *
     */
    if(Config::$instance === null) {
        Config::$instance = new Config();
    }

    return Config::$instance;
}

public static function set ($setData, $flag = false) {
   $instance = Config::$instance;

   $instance->$setData = $setData;

    if($instance->$setData) {
        return $flag = true;
    }else {
        return $flag = false;
    }

   //return $instance->$setData = $setData;
}
}

这是我试图传递的测试

<?php

assert_options(ASSERT_ACTIVE, 1) and assert_options(ASSERT_BAIL, 1);

$config = Config::singleton();
assert($config === Config::singleton());

$config->set('foo', true);
assert($config['foo'] === true);


print "All Tests Passed\n";

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

由于无法修改测试,要修复Cannot use object of type Config as array,必须使Config对象像数组一样运行。它需要2次更改:

  • 延长ArrayObject
  • 调用ArrayObject构造函数进行正确配置:
class Config extends ArrayObject {
  public function __construct() {
    parent::__construct( array(), ArrayObject::ARRAY_AS_PROPS );
  }
  ...
}

如果没有ARRAY_AS_PROPS选项,您将收到错误Undefined index: foo

<强>替代

这通常是通过实施__set__get__isset来完成的。和__unset

我们的想法是您访问配置元素,就像它们是字段一样,如:

$config->foo = 'bar'

在这种情况下,如果字段foo不存在,PHP将调用$config->__set( 'foo', 'bar' )。同样,如果您阅读该字段,则会调用__get( 'foo' )

有关详细信息,请参阅PHP Overloading

这是更新后的测试:

<?php
require_once 'Config.php';

assert_options(ASSERT_ACTIVE, 1) and assert_options(ASSERT_BAIL, 1);

$config = Config::singleton();
assert($config === Config::singleton());

$config->foo = true;
assert($config->foo === true);

print "All Tests Passed\n";

这里是Config课程,只做了一些修改:

  • 不是将配置数据$config存储在public static字段中,而是将其存储为private字段。
  • 静态Config::set()方法委托给$instance
class Config
{
  private  static $instance;
  private $config;

  private static function load() {
      $data = include('data.php');
      static::$config = $data;
      return static::$config;
  }

  // constructor
  protected function __construct(){}

  /**
   *  Returns single instance of this class
   */
  public static function singleton(){
    return self::$instance === null
      ? self::$instance = new Config()
      : self::$instance;
  }

  public static function set($field, $value) {
    return Config::$instance->$field = $value;
  }

  public function __set($field, $value ) {
    $this->config[$field] = $value;
  }

  public function __get($field) {
    return $this->config[$field];
  }

  public function __isset($field) {
    return isset( $this->config[$field] );
  }

  public function __unset($field) {
    unset( $this->config[$field] );
  }

}