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


How to rewrite code to avoid using global arrays?

我有以下一段代码:

$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." );
}

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

可以将数据封装在类中。如果您计划使用$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";

试一试

使用常量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";
}

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

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

class ItemList {
  private $list = ...
  function exists(...) { if ($this->list[..]) ... }
...
}

但是我想知道你为什么要这样做?在我看来,这是一个完全有效的情况下使用全局变量…他们并不像大家说的那么坏。

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

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;