我有以下一段代码:
$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;