PHP是一种混合范式语言,允许使用和返回非对象数据类型,例如数组。我提出一个问题,试图在确定在特定情况下使用哪种编程构造时,阐明一些选择数组还是对象的准则。
这实际上是一个有关使用PHP语言构造对数据进行编码的方法以及何时更可能为了数据传递目的而选择另一种方法(即面向服务的体系结构或Web服务)的问题。
例
假设您的商品类型由{cost,name,part_number,item_count}组成。您的程序要求显示几种此类项目,并决定使用数组作为外部容器来保存每种项目类型。[您也可以使用PHP的ArrayObject
OO范例,但是我的问题不是关于那个(外部)数组的]。我的问题是关于如何对项目类型数据进行编码,以及使用哪种范式。PHP允许您使用PHP Native Arrays
或PHP Objects
。
我可以通过两种方式对此类数据进行编码,如下所示:
//PHP's associative arrays:
$ret = array(
0 => array(
'cost' => 10.00,
'name' => 'item1',
'part_number' => 'zyz-100',
'item_count' => 15
),
1 => array(
'cost' => 34.00,
'name' => 'item2',
'part_number' => 'abc-230',
'item_count' => 42
),
);
与
//here ItemType is encapsulated into an object
$ret = array(
0 => new ItemType(10.00, 'item1', 'zyz-100', 15),
1 => new ItemType(34.00, 'item2', 'abc-230', 42),
);
class ItemType
{
private $price;
private $name;
private $partNumber;
private $itemCount;
function __construct($price, $name, $partNumber, $itemCount) {..}
}
我在想什么
数组编码是轻量级的,并且更支持JSON,但更容易弄乱。拼写错误的关联数组键之一,您可能会遇到更难以捕获的错误。但是,随心所欲地更改也更容易。说我不想再存储item_count
了,我可以使用任何文本处理软件轻松删除item_count
阵列中的所有实例,然后相应地更新使用它的其他功能。这可能是一个比较乏味的过程,但是很简单。
面向对象的编码要求使用IDE和PHP语言工具,从而可以更轻松地预先捕获任何错误,但首先很难进行编程和编码。我更难地说,因为您必须仔细考虑对象,提前思考,并且OO编码比键入数组结构要花更多的认知负担。就是说,一旦编码完成,从某种意义上说,某些更改可能更容易实现,item_count
例如,删除只需更改较少的代码行。但是,与数组方法相比,更改本身可能仍需要更高的认知负担,因为涉及到更高级别的OO工具。
题
在某些情况下很明显,例如需要对数据进行操作的情况。但是在某些情况下,当我只需要存储几行“项目类型”数据时,在尝试决定是否使用数组还是构造对象时,我没有明确的指导方针或考虑因素。看来我只能抛硬币然后选一个。是这样吗?
array
,2: User-defined Class
,3: stdClass
。在速度方面的性能与array
和时User-defined class
(例如您的ItemType
)相比几乎相同,但已定义的class
es使用的内存往往比使用array
s 少。stdClass
另一方面,这是三个选项中最慢的一个,它也使用最多的内存。
(object)['foo'=>'bar']
。结果值具有classStdClass
,将全部通过JSON编码,json_encode()
并且属性可以像数组索引一样容易地重命名(当通过变量间接访问时,这并不总是那么容易)。但是,对这些值有不同的操作。例如,您没有对象联合,就没有数组联合,也不能直接使用这些array_*()
函数。