2009-10-14 40 views
0
$test = 'love'; 
$eff = end(explode('ov',$test)); 

我找不出来;奇怪的是,这并没有得到一个抱怨:​​为什么php抱怨通过引用在此代码中传递?

$test = 'love'; 
$eff = current(explode('ov',$test)); 

我得到的错误是: 严格:只有变量应该按引用传递

+0

这是一个奇怪的一个。 – mauris 2009-10-14 02:10:19

+0

你想在这里做什么?如果你期待end()给你数组中的最后一个元素,那么你误解了这个函数。 – 2009-10-14 04:02:46

回答

2

end()通过引用修改传递给它的数组。首先将爆炸分配给变量,以便end()有一个可以修改的参考。

$test = 'love'; 
$explosion = explode('ov',$test); 
$eff = end($explosion); 

end()只所以不修改数组的内容,无论如何,除非你正在使用的current()each()next()很多关于迭代,你不会注意到变化的内部指针。

如果end()这个限制是讨厌你身边有它的方式:

function last($array) { return end($array); } 
$test = 'love'; 
$eff = last(explode('ov', $test)); 
2

explode返回临时数组,你是不是'存储'到一个变量,而是直接传递给期望参考的end

我相信current不会触发错误的原因是它是非变异的。其他变异函数如array_unshiftreset也会抱怨。

+0

'current'也需要参考。就是这样。 – mauris 2009-10-14 02:13:04

+0

看到编辑,我认为这是因为只读的东西。 – p00ya 2009-10-14 02:20:02

0
<?php 

error_reporting(E_STRICT); 

$test = 'love'; 
$eff = end(explode('ov',$test)); 
var_dump($eff); 

?> 

如果您的错误报告级别未设置为E_STRICT,它将正常工作。

看到,当你有一个临时数组返回时,你不能像这样设置内部指针。您需要首先将其设置为变量,然后使用end()将内部指针移至末尾。

确实如此:reset(),next(),prev()等等。

下面的工作会改变。

<?php 

error_reporting(E_STRICT); 

$test = 'love'; 
$a = explode('ov',$test); 
$eff = end($a); 
var_dump($eff); 

?> 

current()的作品,因为它不会移动内部指针,但要获得当前有哪些元素,内部指针所指向。

+0

当你在PHP 5.x中使用''error_reporting(E_STRICT)''时,你会得到错误。 E_STRICT只是PHP 6.x下E_ALL的一个子集。 – p00ya 2009-10-14 02:26:42

+0

我认为,根据PHP版本的不同,'E_STRICT'是否是'E_ALL'的一个子集。它不是,然后它是,然后它不再。但是你永远不想只把'error_reporting'设置为'E_STRICT'。你想和'E_ALL'('error_reporting(E_ALL | E_STRICT);')一起使用,否则你会错过重要的非严格错误。如果'E_STRICT'包含在'E_ALL'中,它不会对OR造成任何伤害。 – 2009-10-14 04:03:15

5

end通过将数组的内部指针移动到数组的末尾来更改数组的内部指针。因此,该参数必须是可变的(即对数组的引用)才能有用。这就是你收到警告的原因。

current根本不接触阵列;它只看数组。因此,该参数不需要是可变的(因此可以通过值传递),并且操作不会给出警告。

相关问题