gpt4 book ai didi

php - 创建类的集合方法的正确方法

转载 作者:搜寻专家 更新时间:2023-10-31 21:04:19 24 4
gpt4 key购买 nike

我在通过单元测试时遇到了问题。问题是 set 方法创建了索引,但我不知道如何返回真实值。我不太了解如何为这个特定的单元测试正确创建一个 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";

非常感谢任何帮助。

最佳答案

由于您无法修改测试,要修复 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() 方法委托(delegate)给 $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] );
}

}

关于php - 创建类的集合方法的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35241616/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com