PHP数组引用不一致

时间:2018-07-29 07:00:48

标签: php

我有一个HTML表单,该表单发布了具有诸如THOMATION $ 0和THOMATION $ 1之类的名称的字段,我想将它们映射到诸如具有$ gvar [0]-> thing和$ gvar [1]-> thing之类名称的全局PHP变量。我解析字段名称以获得“事物”和下标值0和1。我想要一个PHP函数,该函数将返回对$ gvar的引用。 [对象名称比$ gvar还要复杂-我在简化整个问题。]

函数的两个版本:

AVCaptureVideoPreviewLayer

两个版本都将[0]元素创建为目标数组。第一个版本将其留给调用方以创建[1]元素。第二个版本创建两个数组元素。来自C ++背景,在我看来,这两个版本应产生相同的结果,但事实并非如此。看来,PHP不允许您从函数返回对数组的引用-您只能返回其元素与函数内看到的元素相同的数组的副本。

有没有一种方法可以避免函数创建[0]之后的数组元素,以便调用函数可以使用POSTed字段的名称Thing $ 1,Thing $ 2,…来创建尽可能多的$ gvar [1], $ gvar [2],...是否需要元素?

1 个答案:

答案 0 :(得分:0)

我认为您的问题来自传递给函数或从函数返回时对类型的不同处理。如果返回null,bool,int或float,它们将被有效复制。如果它们是像stdClass,传递给函数的内容的行为类似于C ++引用,因此在函数内部和外部都引用同一对象。意料之外的部分(至少对我也有C ++背景的人而言)是数组不被视为对象的事实。因此,当您返回一个数组时,将对其进行复制,并且如果该数组包含一个对象,则该副本具有一个引用同一对象的元素。

注意:我写“有效复制”是有原因的。我不确定PHP的内部结构,但是对于像bool这样的简单类型,可能无法修改它们。然后,您唯一可以做的就是为变量分配一个不同的实例。此外,PHP可能会使用“写时复制”来避免复制开销。两者都是不影响语义的实现细节。

现在,关于您的目标,函数同时写入全局变量并返回这些全局变量似乎很奇怪。我会选择两个,最好是不使用全局变量的一个。有效地,您采用HTTP请求参数并将其转换为其他表示形式。为此,我将使用单个函数来执行该操作并返回结果。由于它是一个纯函数,因此它也可以更容易进行单元测试。