如何重写代码以避免使用全局数组?

时间:2011-12-01 20:34:50

标签: php arrays global-variables

我有以下代码:

$item_list = array();
$item_list['PENCIL']   = "Utility used to write.";
$item_list['CAR']      = "A means of transportation.";

function item_exists($name) {
    global $item_list;

    return isset($item_list[$name]);
}

function get_item_description($name) {
    global $item_list;

    return ( item_exists($name) ? $item_list[$name] : "Unknown item." );
}

在文件的顶部定义一个数组,该数组包含具有描述的项目列表,这些项目由多个函数使用。数组从不在函数中修改,它仅用作只读数据。如果我想重写这段代码以避免使用全局变量,那么最好的方法是什么?

4 个答案:

答案 0 :(得分:4)

您可以将数据封装在一个类中。如果您计划使用$item_list进行其他操作,这尤其适用。

这些方面应该让你开始:

<?php
class Items
{
    private $item_list = array(
        'PENCIL' => "Utility used to write.",
        'CAR'    => "A means of transportation."
    );

    private function exists($name) {
        return isset( $this->item_list[$name]);
    }

    public function __get($name) {
        return ( $this->exists($name) ? $this->item_list[$name] : "Unknown item." );
    }

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

$items = new Items;
echo $items->PENCIL . "\n"; // __get() will be called to retrieve this element's value
echo $items->IDUNNO . "\n";
$items->IDUNNO = "Not an unknown item.";
echo $items->IDUNNO . "\n";

Try it out

答案 1 :(得分:2)

使用 constants define()定义要在整个脚本中使用的常量。

define('PENCIL', 'Utility used to write.');
define('CAR', 'A means of transportation.');

function item_exists($name) {
    return defined($name);
}
function get_item_description($name) {
    return item_exists($name) ? constant($name) : "Unknown Item";
}

答案 2 :(得分:0)

您可以将数组硬编码到每个函数中。这是最简单的解决方案,但我认为每个人都同意这是最糟糕的解决方案。它是多余的,可能导致错误......

另一种方法是创建一个类并将数组存储在私有变量中:

class ItemList {
  private $list = ...

  function exists(...) { if ($this->list[..]) ... }
...
}

但我想知道你为什么要这样做?在我看来,这是一个使用全局变量的完全有效的案例......它们并不像每个人所说的那样邪恶。

答案 3 :(得分:0)

我会这样做,可重复使用且松散耦合

class ItemList {

    private var $item_list = array();

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

    public function __get($name) {
        return (isset($this->item_list[$name]) ? $this->item_list[$name] : "Unknown item.");
    }

}

$item_list = new ItemList();
$item_list->PENCIL = "Utility used to write.";
$item_list->CAR = "A means of transportation.";
echo $item_list->PENCIL;
echo $item_list->SO;